Laravel — выполнение функции до запуска запроса

Есть ли способ для Eloquent / raw запросов выполнить функцию до запуска запроса? Было бы также хорошо, если бы я мог расширить функциональность, передавая параметр, если функция должна быть запущена раньше или нет. В зависимости от результата функции (true / false) запрос не должен выполняться.

Я бы неплохо использовал принцип «DB::listenmsgstr «, но я не уверен, что смогу остановить или выполнить запрос из этой функции.

Причина этого в том, что я хотел бы создать небольшое хранилище данных для постоянного сохранения результатов в хранилище (дБ), а не запрашивать постоянно огромную базу данных.

Метод, который я хотел бы использовать, состоит в том, чтобы создать хэш запроса, проверить, существует ли хэш на складе. Если он существует, то значение возвращается. Если нет, то запрос выполняется и выходные данные сохраняются вместе с хешем в хранилище.

Есть идеи?

///// РЕДАКТИРОВАТЬ /////
Я должен уточнить, что я хотел бы получить доступ к запросам и обновить значение, если необходимо обновить вычисленное значение. Т. е .: количество автомобилей в декабре: пока я в декабре, мне нужно постоянно обновлять стоимость. Поэтому я сохраняю выполненный запрос в БД и просто извлекаю его, запускаю и обновляю значение.

//// РЕДАКТИРОВАТЬ 2 /////
введите описание изображения здесь

Github: https://github.com/khwerhahn/datawarehouselibrary/blob/master/DataWareHouseLib.php

Чего я хотел бы добиться, так это подключиться к логике запросов / Eloquent Laravels и использовать логику хранилища данных в фоновом режиме.

Может быть, что-то вроде этого:

$invalid_until = '2014-12-31 23:59:59'; // date until query needs to be updated every ten minutes
$cars = Cars::where('sales_month', '=', 12)->dw($invalid_until)->get();

Если добавить dw ($ date_parameter), я бы хотел, чтобы Laravel выполнил логику хранилища данных в фоновом режиме, и, если она найдена в БД, то не будет выполнять запрос снова.

4

Решение

Вам не нужно использовать события для достижения этой цели. Из 4.2 документов:

Вы можете легко кэшировать результаты запроса, используя метод запоминания:

$users = DB::table('users')->remember(10)->get();

В этом примере результаты запроса будут кэшироваться в течение десяти
минут. Пока результаты кэшируются, запрос не будет запущен
против базы данных, и результаты будут загружены из значения по умолчанию
драйвер кеша указан для вашего приложения.

http://laravel.com/docs/4.2/queries#caching-queries

Вы также можете использовать это для Eloquent объектов,

например: User::where($condition)->remember(60)->get()

0

Другие решения

Я понимаю, что вы пытаетесь сделать, но когда я это вижу (хотя, возможно, я все еще не понимаю это правильно), вы еще может сойти с рук с помощью rememberForever() (если вы не хотите конкретный срок)

Итак, давайте представим, что у вас есть стол с автомобилями.

$cars = Cars::where('sales_month', '=', 12)->rememberForever()->get();

Чтобы обойти проблему удаления кэша, вы можете назначить ключ для метода кэширования, а затем получить его по этому ключу. Теперь вышеприведенный запрос становится:

$cars = Cars::where('sales_month', '=', 12)->rememberForever('cars')->get();

Каждый раз, когда вы запускаете этот запрос, вы будете получать те же результаты, впервые из БД, а все остальные из кеша.

Теперь вы говорите, что собираетесь обновить таблицу, и вы хотите сбросить кэш, верно?
Итак, запустите обновление, затем забудьте () кэш с cars индекс:

// Update query
Cache::forget('cars');

Ваш следующий вызов по запросу Cars выдаст новый набор результатов, и он будет кэширован. Если вам интересно, то remember() а также rememberForever() являются методами класса QueryBuilder, которые используют тот же класс Cache, который вы можете увидеть в документации в своем собственном разделе.

В качестве альтернативы, вы также можете напрямую использовать класс Cache (это дает вам лучший контроль):

if (null == $cars= Cache::get('cars')) {
$cars = Cars::where('sales_month', '=', 12)->get();
Cache::forever('cars', $cars);
}
0

Переопределив метод runSelect, существует в Illuminate \ Database \ Query \ Builder, который выполняется в каждом запросе выбора в Laravel.

увидеть этот пакет:
https://github.com/TheGeekyM/caching-queries

0