Я использую Phalcon 3.4 и PHP 7.2 ----
Я пытаюсь использовать конструктор Query Builder и просто указать переменную args для создания моего запроса.
Я надеюсь, что смогу динамически создавать объединенные запросы таким образом.Оба класса имеют четко определенные отношения «многие ко многим».Я хотел бы иметь возможность просто указать, что мне нужны Person и Address, и он знает, как использовать таблицу PersonAddress, чтобы найти взаимосвязи ...
Person Table:
id lastName firstName displayAs
1 Smith Jeff J Smith
2 Johnson Mark Mark Johnson
3 Rivers Sally Sally Rivers
4 Smith Anna Anna Smith
5 Rivers Billy Billy Rivers
PersonТаблица адресов
person_id address_id
1 1
4 1
2 3
5 3
3 4
и, наконец, таблица адресов
id nickname streetNumber streetName city state zipcode
1 Home 123 Main St Windsor CO 80550
2 Work 2561 S Shields Fort Collins CO 80526
3 Home 512 Rock Ave Loveland CO 12352
4 Home 999 Uh Oh St Severance CO 80550
Модели Person и AddressAddress имеют четко определенные отношения.(Создано с использованием скаффолдинга)
public function initialize()
{
$this->setSchema("test");
$this->setSource("person");
$this->hasMany('id', 'models\PersonAddress', 'person_id', ['alias' => 'PersonAddress']);
$this->hasMany('id', 'models\PersonFamily', 'person_id', ['alias' => 'PersonFamily']);
}
Однако, по-видимому, по умолчанию используется внешнее соединение.
$params = [
"models" => ["models\\Person", "models\\PersonAddress"],
"columns" => ['firstName', 'lastName', 'address_id', 'person_id'],
"conditions" => "lastName = 'Smith'",
];
$queryBuilder = new \Phalcon\Mvc\Model\Query\Builder($params, $this->getDI());
/** @var Phalcon\Mvc\Model\Resultset\Simple $result */
$result = $queryBuilder->getQuery()->execute();
$this->assertEquals(10, $result->count() );
//Double check the last name
foreach($result->jsonSerialize() as $row){
echo "" . implode(" ", $row) . "\n";
$this->assertEquals('Smith', $row['lastName']);
}
echo "All Good!\n";
echo print_r($result->jsonSerialize(),true);
$this->assertTrue(true);
Выходы:
Jeff Smith 1 1
Anna Smith 1 1
Jeff Smith 1 4
Anna Smith 1 4
Jeff Smith 3 2
Anna Smith 3 2
Jeff Smith 3 5
Anna Smith 3 5
Jeff Smith 4 3
Anna Smith 4 3
Есть ли способ указать, что он выполняет неявное внутреннее (или левое) соединение с определенными им отношениями внешнего ключа?
Похоже, что существует метод соединения, который выполняет неявное соединение, который я мог бы использовать, если бы и у меня тоже, но он был бы намного чище, если бы все можно было просто перечислить в параметрах!