2016-07-14 1 views
1

J'ai un modèle, appelons-le Robot, qui a de multiples relations manyToMany avec d'autres modèles - Part, Country et Permision. Les modèles de relation étant RobotsParts, RobotsCountries et RobotsPermissions.PhalconPHP - obtenir un objet spécifique avec plusieurs relations

Chaque robot peut avoir plusieurs ou plusieurs pièces, pays et autorisations liés.

Pour obtenir tous les robots avec une certaine partie, PhalconPHP le rend facile. (les alias sont correctement définis dans les modèles, bien sûr).

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

La même chose vaut pour les robots avec un pays:

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

Mais comment peut-on obtenir que des robots avec une certaine partie, le pays et la permission?

J'ai eu des tentatives futiles comme:

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

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

Mais, bien sûr, PARTID est pas reconnu comme il ne fait pas partie de l'un des modèles sélectionnés;

Répondre

0

Vous pouvez utiliser l'option $model->getRelated('model', $parameters = []).
$parameters = [] fonctionne de la même manière que vous interrogeriez normalement un modèle. c'est à dire; il prend les paramètres order, limit, conditions, ...

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

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

Vous pouvez trouver cela dans the documentation


MISE À JOUR

Cela sonne comme il ne serait pas possible. Vous devrez appeler une requête personnalisée sur votre modèle Robot. Quelque chose comme ceci:

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

Vous pouvez également utiliser le Querybuilder, si vous préférez l'utiliser.

+0

Les paramètres que la fonction getRelated ('Robot', [params]) accepte ne sont que les colonnes du modèle Robot. Le reste lance une erreur "Phalcon \ Mvc \ Model \ Exception: Column 'partId' n'appartient à aucun des modèles sélectionnés". – Vorta

+0

@Vorta, aha, on dirait que ce ne serait pas possible. Vous devrez utiliser une requête personnalisée. Vérifiez ma réponse mise à jour, il pourrait vous aider à démarrer! – Timothy

+0

Requête personnalisée c'est. Cependant, une petite correction pour ce qui précède: '$ resultat = Robot :: query()'. Tout le reste reste le même. J'ai testé la solution et j'obtiens les résultats attendus. Pas la plus belle chose, mais fait le travail. Je vous remercie! – Vorta