2016-07-14 11 views
1

Ich habe ein Modell, nennen Sie es Roboter, der mehrere manyToMany-Beziehungen mit anderen Modellen hat - Teil, Land und Zulassungen. Beziehungsmodelle sind RobotsParts, RobotsLoands und RobotsPermissions.PhalconPHP - get spezifisches Objekt mit mehreren Beziehungen

Jeder Roboter kann mehrere oder keine Teile, Länder und Berechtigungen enthalten.

Um alle Roboter mit einem bestimmten Teil zu bekommen, macht PhalconPHP es einfach. (Aliase sind natürlich in Modellen richtig eingestellt).

$part = Part::findFirstByName("arm"); 
$robotsWithPart = $part->robots; 

Das gleiche gilt für Roboter mit einem bestimmten Land:

$country = Country::findFirstByCode("HR"); 
$robotsWithCountry = $country->robots; 

Aber wie kann man nur Roboter mit einem bestimmten Teil, das Land und die Erlaubnis bekommen?

Ich habe vergeblich versucht, wie:

$country = Country::findFirstByCode("HR"); 
$part = Part::findFirstByName("arm"); 

$robots = $country->getRobots([ 
    'conditions' => "(partId = :pid:)", 
    'bind' => [ 
     'pid' => $part->id 
    ] 
]); 

Aber natürlich wird partid nicht erkannt, da es nicht zu einem der ausgewählten Modelle gehört;

Antwort

0

Sie können die Option $model->getRelated('model', $parameters = []) verwenden.
$parameters = [] funktioniert genauso, wie Sie normalerweise ein Modell abfragen würden. d. es nimmt die Parameter order, limit, conditions, ...

$country = Country::findFirstByCode("HR"); 
$part = Part::findFirstByName("arm"); 

$robots = $country->getRelated('Robot', ['partId = ' . $part->id]); 

du in the documentation


UPDATE

dass es nicht möglich klingt wie zu finden sein würde. Sie müssen eine benutzerdefinierte Abfrage auf Ihrem Robot Modell aufrufen. Etwas wie folgt aus:

$result = Robot::query() 
     ->join('Country', 'Country.id = Robot.countryId') 
     ->join('Part', 'Part.robotId = Robot.id') 
     ->where('Country.code = :code:') 
     ->where('Part.name = :name:') 
     ->bind(['code' => 'HR', 'name' => 'arm']) 
     ->execute(); 

Sie können auch die Querybuilder verwenden, wenn Sie es vorziehen, dass zu verwenden.

+0

Die Parameter, die die Funktion getRelated ('Robot', [params]) akzeptiert, sind nur die Spalten im Robot-Modell. Der Rest wirft einen Fehler "Phalcon \ Mvc \ Model \ Exception: Spalte 'partId' gehört zu keinem der ausgewählten Modelle". – Vorta

+0

@Vorta, Aha, klingt so, als wäre das nicht möglich. Sie müssen eine benutzerdefinierte Abfrage verwenden. Überprüfen Sie meine aktualisierte Antwort, es könnte Ihnen helfen, loszulegen! – Timothy

+0

Benutzerdefinierte Abfrage ist es. Allerdings eine kleine Korrektur für die oben genannten: '$ result = Robot :: query()'. Alles andere bleibt gleich. Ich habe die Lösung getestet und erwarte Ergebnisse. Nicht die schönste Sache, aber erledigt den Job. Vielen Dank! – Vorta