Автоматическое объединение с использованием определенных отношений внешних ключей в Phalcon? - PullRequest
0 голосов
/ 13 декабря 2018

Я использую 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

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

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

1 Ответ

0 голосов
/ 26 марта 2019

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

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

, но для того, чтобы иметь Таблицу адресов, вам нужно будет привести пример условия здесь: (при условии, что в таблице адресов есть модели моделей \ 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

...