2017-11-26 4 views
0

Ich arbeite an einer Laravel-Anwendung mit vielen beredten Modellen. Diese beredten Modelle (z. B. Benutzer, Post usw.) enthalten auch viele Abfragen, die nur lose mit dem Modell verbunden sind (oft rohe SQL).Laravel, beste Stelle/Benennung für Abfragen im Zusammenhang mit mehreren db-Tabellen

Einige Abfragen sind wie, "Holen Sie mir einige Informationen aus einer Tabelle, einige andere und ein wenig Informationen aus einer dritten Tabelle". Jetzt können Modelle wie das Benutzermodell viele Methoden wie getAllUncompletedActionsForUser oder getSessionsDurationsPerUser haben. Ich denke, es ist nicht schön, wenn ein eloquentes Modell tausende Zeilen Code haben wird.

Was würden Sie von der Aufteilung dieser Modelle halten, wo würden Sie setzen und wie würden Sie Klassen benennen, die Datenbankergebnisse zurückgeben, die sich mit vielen verschiedenen Tabellen befassen?

Antwort

0

Haben Sie über die Verwendung von Traits nachgedacht?

Wenn es nach mir ginge, würde ich einen Ordner App/Traits erstellen und zum Beispiel eine UserActions Eigenschaft haben, die die getAllUncompletedActionsForUser() Funktion hat. Die Eigenschaft UserActions kann in jeder geeigneten Klasse/Modell verwendet werden.

+0

Wenn Merkmale die Antwort sind, dann stellen Sie die falsche Frage. –

+0

@ tereško Nachdem Sie Ihre Antwort gesehen haben, ist Ihre eine viel bessere Lösung. +1 Ich wusste nichts über Datenmapper. – Spacemudd

+1

Es gibt auch andere Muster, wie [Table Gateways] (https://martinfowler.com/eaaCatalog/tableDataGateway.html) und einige andere Optionen. Sie sollten wahrscheinlich versuchen, [dieses Buch] (https://www.amazon.de/Enterprise-Application-Architecture-Addison-Wesley-Signature/dp/0321127420) irgendwo zu finden. Der Grund, warum Leute Eigenschaften so wenig mögen, ist, dass sie wirklich Kopier-Paste auf Maschinenebene sind. Der PHP-Interpretator kopiert physikalisch in das Codefragment, bevor es geparst wird. –

2

Willkommen im Engpass des active record Muster. Deshalb nennen so viele Leute es als Anti-Muster.

Anstatt zu versuchen, mehr Funktionalität in der gleichen Klasse zu drücken, sollten Sie den nur vage-bezogene Persistenzlogik data mappers Eigenständig in Bewegung setzen.

Kinda wie folgt aus:

$user = App\Entity\User::find($id); 

$mapper = new App\Mapper\UserActions($dbConnection); 
$mapper->fetchIncompleted($users); 

var_dump($user->getActions(App\Entity\User::ACTION_INCOMPLTE)); 

Natürlich werden Sie wahrscheinlich IoC nutzen wollen (wenn möglich) für diese Mapper in der gegebenen Dienst Injektion anstelle von new Operator in irgendeiner beliebigen Stelle zu verwenden.

+0

Ich werde mich darum kümmern, habe dieses Muster schon einmal gesehen, denke aber, dass es chaotisch sein kann, wenn man nicht ständig Mapper benutzt. Ich auch, obwohl der Mapper eine Art Adapter zwischen dem DB-Objekt (wie es gespeichert ist) und dem Objekt als eine Entität in Code (wie es verwendet wird). – Roderik

Verwandte Themen