Laravel - 在触发查询之前执行函数

时间:2014-10-14 10:56:45

标签: php laravel laravel-4 data-warehouse

有没有办法让Eloquent / raw查询在触发查询之前执行一个函数?如果我可以扩展功能以传递参数,如果该函数应该在之前运行,那也是很好的。根据函数的结果(true / false),不应执行查询。

我很高兴使用“DB::listen”的主体,但我不确定是否可以在此函数中停止或运行查询。

这样做的原因是我想自己构建一个小数据仓库,以便永久地将结果保存到仓库(db),而不是一直查询庞大的数据库。

我想要使用的方法是创建查询的哈希,检查仓库中是否存在哈希。如果存在,则返回该值。如果不是,则执行查询并将输出与散列一起保存到仓库中。

有什么想法吗?

/////编辑///// 我应该澄清一下,如果需要更新计算值,我想访问查询并更新值。即:12月份的汽车数量:当我在12月份时,我需要经常更新价值。所以我将执行的查询存储在数据库中并只检索它,运行它然后更新值。

////编辑2 ///// enter image description here

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

我想要实现的是挂钩Laravels查询/ Eloquent逻辑并在后台使用数据仓库逻辑。

也许是这样的:

$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在后台执行数据仓库逻辑,如果在db中找到,则不再执行查询。

3 个答案:

答案 0 :(得分:0)

您无需使用事件来完成此操作。来自4.2文档:

  

缓存查询

     

您可以使用remember方法轻松缓存查询结果:

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

在此示例中,查询结果将缓存为十   分钟。在缓存结果时,将不会运行查询   对数据库,结果将从默认加载   为您的应用程序指定的缓存驱动程序。

     

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

您也可以将此用于Eloquent对象,

例如:User::where($condition)->remember(60)->get()

答案 1 :(得分:0)

我得到你正在尝试做的事情,但是当我查看它时(我可能仍然没有做到正确),你仍然可以使用{{1} (如果你不想要特定的时间限制)

所以,让我们假装你有一张汽车牌桌。

rememberForever()

要解决删除缓存的问题,可以为缓存方法指定一个键,然后通过该键检索。现在,上面的查询变为:

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

每次运行该查询时,您将获得相同的结果,第一次来自数据库,其他所有来自缓存。

现在你说你要更新表了,你想要重置缓存,对吧? 因此,运行您的更新,然后忘记()使用$cars = Cars::where('sales_month', '=', 12)->rememberForever('cars')->get(); 索引的缓存:

cars

您对Cars查询的下一次调用将发出一个新的结果集,它将被缓存。如果您想知道,// Update query Cache::forget('cars'); remember()是QueryBuilder类的方法,它们使用您在其自己的部分中的文档中可以看到的相同Cache类。

或者,实际上,您也可以直接使用Cache类(它可以让您更好地控制):

rememberForever()

答案 2 :(得分:0)

通过覆盖方法runSelect存在于Laravel中每个选择查询中运行的Illuminate \ Database \ Query \ Builder中。

看到这个包: https://github.com/TheGeekyM/caching-queries