【发布时间】: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
有没有办法指定它对已定义的外键关系执行隐式内部(或左)连接?
似乎有一个执行隐式连接的连接方法,如果我也有的话,我可以使用它,但如果所有内容都可以在参数中列出,那真的会干净得多!
【问题讨论】: