Wie nach Bedingungen für zugeordnete Modelle filtern?

8

Ich habe eine assignesToMany-Verknüpfung für Benutzer und Kontakte.

Ich möchte die Kontakte des angegebenen Benutzers finden. Ich würde etwas wie

brauchen %Vor%

Das Kochbuch spricht davon, Bedingungen zu enthalten, benutzerdefinierte Finder-Methoden zu geben und Assoziationsschlüssel zu singen, aber ich habe nicht herausgefunden, wie man diese zusammenstellt.

    
rrd 07.11.2014, 10:27
quelle

1 Antwort

17

Verwenden Sie Query :: matching () oder Query :: innerJoinWith ()

Wenn Sie von der Tabelle Contacts abfragen, dann suchen Sie nach Query::matching() oder Query::innerJoinWith() , nicht (nur) Query::contain() .

Siehe Kochbuch & gt; Datenbankzugriff & amp; ORM & gt; Abfragegenerator & gt; Filtern nach zugeordneten Daten

Hier ist ein Beispiel mit Ihren Tabellen:

%Vor%

Dies fügt automatisch die erforderlichen Joins + Bedingungen zur generierten Abfrage hinzu.

Zielen Sie auf die Join-Tabelle

Falls Sie manuell eine Viele-zu-Viele-Verknüpfung über hasMany und belongsTo einrichten, können Sie direkt auf die Join-Tabelle zielen:

%Vor%

Include containments

Falls Sie wirklich möchten, dass alle Assoziationen auch in Ihren Ergebnissen zurückgegeben werden, verwenden Sie einfach weiterhin contain() too

%Vor%

Das würde alle Benutzer enthalten, die zu einem Kontakt gehören.

In Fällen, in denen Sie mehrere Übereinstimmungen haben und nur diese Übereinstimmungen enthalten möchten, müssen Sie auch das Containment filtern. In diesem Beispiel macht es wenig Sinn, da es nur eine Übereinstimmung geben würde, aber in anderen Situationen könnte es nützlich sein, wenn Sie zum Beispiel alle Kontakte mit aktiven Benutzern abgleichen und die Kontakte einschließlich aller Kontakte abrufen möchten die zugehörigen aktiven Benutzer:

%Vor%

Tiefe Assoziationen

Sie können auch auf tiefere Assoziationen zielen, indem Sie die aus Query::contain() bekannte Syntax für den Punktnotierten Pfad verwenden. Wenn Sie beispielsweise eine Users hasOne Xyz Assoziation hätten, könnten Sie nach Xyz.id mit

filtern %Vor%

Wählen Sie stattdessen aus der anderen Tabelle

Mit diesen Assoziationen und Ihren einfachen Anforderungen können Sie auch leicht von der anderen Seite abfragen, zB über die Users -Tabelle und verwenden Sie nur Query::contain() , um die zugehörigen Kontakte aufzunehmen, wie

%Vor%

Alle Kontakte können dann in der Entitäten contacts -Eigenschaft gefunden werden.

    
ndm 07.11.2014, 11:26
quelle