2017-05-01 2 views
1

Ich benutze ActivityLog für die Protokollierung der Aktivitäten meines Benutzers in Laravel. Dieses Paket funktioniert wirklich gut beim Speichern aller create, update und delete Aktivitäten, die vom Benutzer auf verschiedenen Modellen durchgeführt werden, die ich mit diesem Paket eingerichtet habe.Suche nach benutzerdefinierten Eigenschaften von Spatia Aktivitätsprotokoll in Laravel

Aber es gibt ein Problem, dem ich jetzt gegenüberstehe. Ich habe den ActivityLog Tisch wie unten-

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} 

Ich brauche die Ergebnisse dieser Tabelle durch project_id in der properties Spalte gespeichert gefiltert zu erhalten. Die Paketdokumentation sagt, dass Activity eine normale Eloquent Model ist, so dass wir alle Eloquent bereitgestellten Standardfunktionen verwenden können, um mit dem Activity Modell zu verwenden. Aber ich bin nicht sicher, wie man das mit Eloquent macht.

Gerade jetzt, ich bin, dies zu erreichen durch den Code unten-

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

Das Problem mit meinem obigen Code ist, dass sie alle Aktivitäten bis heute angemeldet holen, so dass ihr Laden all Activity Modelle, die vorhanden ist, und dann filtert durch basierend auf der project_id. Dies wird einige Zeit dauern, wenn die Größe der ActivityLog mit einer Erhöhung auf eine große Anzahl, sagen wir 100.000 Zeilen. Kennt jemand eine bessere Methode zum Abrufen der gefilterten Ergebnisse basierend auf project_id, ohne manuell alle Zeilen zu durchlaufen?

Antwort

0

Wenn Ihre Datenbank JSON-Abfragen unterstützt, können Sie dies tun.

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

Leider unterstützt MariaDB, soweit ich weiß, das nicht, also funktioniert das nur, wenn Sie MySQL 5.7 verwenden.

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

Wenn Sie jedoch sind MariaDB verwenden, können Sie eine virtuelle Spalte auf der Grundlage der JSON-Daten in der properties Spalte und dann Index und Abfrage durch das erstellen.

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

Verwandte Themen