【问题标题】:Automatic Joins using defined foreign key relationships in Phalcon?使用 Phalcon 中定义的外键关系自动连接?
【发布时间】:2018-12-13 00:48:18
【问题描述】:

我正在使用 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

有没有办法指定它对已定义的外键关系执行隐式内部(或左)连接?

似乎有一个执行隐式连接的连接方法,如果我也有的话,我可以使用它,但如果所有内容都可以在参数中列出,那真的会干净得多!

【问题讨论】:

    标签: php database phalcon


    【解决方案1】:

    我推荐使用 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\'');
    

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

    【讨论】:

    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 2021-12-12
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    相关资源
    最近更新 更多