2016-07-14 5 views
1

У меня есть модель, назовите ее Робот, который имеет несколько отношений manyToMany с другими моделями - Part, Country и Permision. Модели отношений - это RobotsParts, RobotsCountries и RobotsPermissions.PhalconPHP - получить конкретный объект с несколькими отношениями

Каждый робот может иметь несколько или без частей, стран и разрешений, связанных с ними.

Чтобы получить все роботы с определенной частью, PhalconPHP упрощает задачу. (алиасы правильно устанавливаются в моделях, конечно).

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

То же самое относится и к роботам с той или иной страной:

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

Но как можно получить только робот с определенной частью, страной и разрешения?

У меня были тщетные попытки, как:

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

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

Но, конечно же, PartID не признается, что не принадлежит ни к одной из выбранных моделей;

ответ

0

Вы можете использовать опцию $model->getRelated('model', $parameters = []).
$parameters = [] работает так же, как и вы обычно запрашиваете модель. то есть; он принимает параметры order, limit, conditions, ...

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

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

Вы можете найти это в the documentation


UPDATE

Это звучит, как это не было бы возможно. Вам нужно будет вызвать пользовательский запрос на вашей модели Robot. Что-то вроде этого:

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

Вы также можете использовать Querybuilder, если хотите использовать это.

+0

Параметры, которые принимают функции GetRelated ('Robot', [params]), являются только столбцами в модели Robot. Остальное выдает ошибку «Phalcon \ Mvc \ Model \ Exception: Column« partId »не относится ни к одной из выбранных моделей». – Vorta

+0

@ Ворта, ага, звучит так, что это было бы невозможно. Вам придется использовать пользовательский запрос. Проверьте мой обновленный ответ, это может помочь вам начать работу! – Timothy

+0

Пользовательский запрос. Однако небольшая поправка для вышеперечисленного: '$ result = Robot :: query()'. Все остальное остается прежним. Я тестировал решение и получаю ожидаемые результаты. Не самая красивая вещь, но выполняет свою работу. Спасибо! – Vorta