使用Phalcon中定义的外键关系自动加入?

时间:2018-12-13 00:48:19

标签: php database phalcon

我正在使用Phalcon 3.4和PHP 7.2 ----

我正在尝试使用查询生成器的构造函数,只是指定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

有没有一种方法可以指定它对定义的外键关系进行隐式内部(或左侧)连接?

似乎有一个执行隐式连接的join方法,如果可以的话,我可以使用它,但是如果所有内容都可以在参数中列出的话,它将变得更加干净!

1 个答案:

答案 0 :(得分:0)

我建议使用PHQL

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

,但是也要拥有地址表,您需要在此处提供条件 示例:(假设地址表具有模型models \ 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\'');

我的建议是在地址表引用表人中创建一个引用键