2017-05-01 1 views
1

나는 Laravel에서 내 사용자의 활동을 기록하는 데 ActivityLog을 사용하고 있습니다. 이 패키지는 내가이 패키지로 설정 한 다양한 모델에 대해 사용자가 수행 한 모든 create, updatedelete 활동을 저장하는 데 아주 효과적입니다.laravel의 Spatie Activity-log의 사용자 지정 속성으로 검색

하지만 지금 직면 한 한 가지 문제가 있습니다. 나는 below-

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} 

같은 ActivityLog 테이블 내가 properties 컬럼에 저장 project_id에 의해 필터링이 테이블의 결과를 얻을 필요가있다. 패키지 설명서에 따르면 Activity은 보통 Eloquent Model이며 EloquentActivity 모델과 함께 기본 기능을 제공합니다. 하지만 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); 
}); 

내 위의 코드의 문제 below- 코드에 의해이를 달성하고 그것을, 날짜까지 기록 된 모든 활동을 반입하는 자사의 로딩 때문에 존재하는 모든 Activity 모델과 project_id을 기준으로 필터링합니다. 이것은 ActivityLog의 크기가 커지면 많은 시간이 걸릴 것입니다. 예를 들어 100,000 개의 행이 있습니다. 누구든지 수동으로 모든 행을 거치지 않고 project_id을 기반으로 필터링 된 결과를 가져 오는 더 나은 방법을 알고 있습니까?

답변

0

데이터베이스가 JSON 쿼리를 지원하는 경우이를 수행 할 수 있습니다.

$activities = Activity::where('properties->project_id', '22295') 
      ->get(); 

불행히도 MariaDB는 내가 지원하는 MySQL을 지원하지 않으므로 MySQL 5.7을 사용하는 경우에만 작동합니다. 당신 있습니다는 MariaDB를 사용하는 경우

https://github.com/spatie/laravel-activitylog/issues/210

그러나, 당신은으로 properties 열 다음 인덱스 및 쿼리에서 JSON 데이터를 기반으로 가상 열을 생성 할 수 있습니다.

https://mariadb.com/resources/blog/json-mariadb-102