Автоматические соединения с использованием определенных отношений внешнего ключа в Phalcon?

Я использую Phalcon 3.4 и PHP 7.2 ----

Я пытаюсь использовать конструктор Query Builder и просто указать переменную args для создания моего запроса.

Я надеюсь, что таким образом смогу динамически создавать объединенные запросы. Оба класса имеют четко определенные отношения «многие ко многим». Я хотел бы иметь возможность просто указать, что мне нужен Person и Address, и он знает, как использовать таблицу PersonAddress для поиска отношений...

Таблица лиц:

    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_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 и PersonAddress имеют четко определенные отношения. (Создано с помощью строительных лесов)

 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

Есть ли способ указать, что он выполняет неявное внутреннее (или левое) соединение для отношений внешнего ключа, которые он определил?

Похоже, что есть метод соединения, выполняющий неявное соединение, который я мог бы использовать, если бы он у меня тоже был, но на самом деле было бы намного чище, если бы все можно было просто перечислить в параметрах!


person Joey Overby    schedule 13.12.2018    source источник


Ответы (1)


я рекомендую использовать PHQL

$this->modelsManager->executeQuery('SELECT * FROM models\\Person LEFT JOIN models\\PersonAddress where models\\Person.lastName = \'Smith\'');

но чтобы иметь таблицу адресов, вам также нужно будет указать здесь условие, например: (при условии, что в таблице адресов есть модель model\Address

$this->modelsManager->executeQuery('SELECT * FROM models\\Person LEFT JOIN models\\PersonAddress LEFT JOIN models\\Address ON models\\PersonAddress.address_id = models\\Address.id where models\\Person.lastName = \'Smith\'');

мой совет - сделать ссылочный ключ в таблице адресов, ссылающейся на таблицу персон

person Talal    schedule 26.03.2019
comment
проверьте эту страницу для получения дополнительной информации о PHQL: docs.phalconphp.com/3.2/en/db -phql - person Talal; 26.03.2019