我正在使用ActivityLog在Laravel中记录用户的活动。此软件包非常适用于存储用户在我使用此软件包设置的各种模型上执行的所有create
,update
和delete
活动。
但我现在面临一个问题。我有ActivityLog
表,如下所示 -
id | log_name | description | subject_id | subject_type | causer_id | causer_type | properties
----------------------------------------------------------------------------------------------------------------------------------------
7 | default | created | 4 | App\Response | 1 | App\User |{"project_id":"22295","feature_id":"2","part_id":"1","response":"yes","user_id":1}
我需要将此表格的结果按project_id
列中存储的properties
进行过滤。包文档说Activity
是正常的Eloquent Model
,因此我们可以使用Eloquent
提供的所有默认函数与Activity
模型一起使用。但我不确定如何使用Eloquent
。
现在,我通过以下代码实现这一目标 -
$activities = Activity::latest()->get()->filter(function($item) use($projectId) {
$properties = $item->properties->toArray();
if(isset($properties['attributes']))
$properties = $properties['attributes'];
return ($properties['project_id'] == $projectId);
});
我上面代码的问题在于它提取到目前为止记录的所有活动,因此它会加载所有存在的Activity
模型,然后根据project_id
进行过滤。当ActivityLog
的大小增加到大量(例如100,000行)时,这将花费很多时间。有没有人知道一种更好的方法来获取基于project_id
的过滤结果,而无需手动遍历所有行?
答案 0 :(得分:0)
如果您的数据库支持JSON查询,则可以执行此操作。
$activities = Activity::where('properties->project_id', '22295')
->get();
不幸的是,据我所知,MariaDB不支持,所以这只适用于MySQL 5.7。
https://github.com/spatie/laravel-activitylog/issues/210
但是,如果你 使用MariaDB,你可以根据properties
列中的JSON数据创建一个虚拟列,然后进行索引和查询。