我正在使用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方法,如果可以的话,我可以使用它,但是如果所有内容都可以在参数中列出的话,它将变得更加干净!
答案 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\'');
我的建议是在地址表引用表人中创建一个引用键