Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php laravel中空间活动日志的自定义属性搜索_Php_Laravel_Laravel 5_Eloquent - Fatal编程技术网

Php laravel中空间活动日志的自定义属性搜索

Php laravel中空间活动日志的自定义属性搜索,php,laravel,laravel-5,eloquent,Php,Laravel,Laravel 5,Eloquent,我正在使用它在Laravel中记录用户的活动。此软件包非常适合存储用户在我使用此软件包设置的各种型号上执行的所有创建、更新和删除活动 但我现在面临一个问题。我有下面的ActivityLog表- id | log_name | description | subject_id | subject_type | causer_id | causer_type | properties ----------------------------------------------------------

我正在使用它在Laravel中记录用户的活动。此软件包非常适合存储用户在我使用此软件包设置的各种型号上执行的所有
创建
更新
删除
活动

但我现在面临一个问题。我有下面的
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\u id
获得此表的结果。软件包文档说明,
Activity
是一个正常的
Eloquent模型
,因此我们可以将
Eloquent
提供的所有默认函数用于
Activity
模型。但我不知道如何使用
雄辩的
做到这一点

现在,我通过下面的代码实现了这一点-

$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);
});

我上面的代码的问题是,它获取了截止日期之前记录的所有活动,因此它加载了所有存在的
活动
模型,然后根据
项目id
进行过滤。当
ActivityLog
的大小增加到一个较大的数字(例如100000行)时,这将花费很多时间。是否有人知道一种更好的方法,可以基于
project\u id
获取过滤结果,而不必手动查看所有行?

如果您的数据库支持JSON查询,您可以这样做

$activities = Activity::where('properties->project_id', '22295')
            ->get();
不幸的是,据我所知,MariaDB不支持这一点,所以这只有在MySQL 5.7上才有效

但是,如果您使用的是MariaDB,则可以基于
属性
列中的JSON数据创建一个虚拟列,然后根据该列进行索引和查询