我正在尝试用phql编写一个简短的查询。我从一个表中选择所有内容,并有一个 where 子句声明另一个表不能有记录连接到这个表。这是原始 sql 查询,当针对我的数据库运行时工作正常,即 Mysql。
select * from application a
where not exists (select distinct 1 from preapproval p where p.application_id = a.id)
所以为了尝试用phql编写这个,我一直在尝试不同的东西,但这就是我最终得到的。
注意:如果我在没有 where 子句的情况下运行它,它工作,从"应用程序"表中选择所有记录。
$manager = 'Phalcon'DI::getDefault()->getShared("modelsManager");
$data = $manager
->createBuilder()
->from(['a' => ''Models'Application'])
->where('not exists (select distinct 1 from ['Models'Preapproval] where ['Models'Preapproval].application_id = a.id)')
->getQuery()
->execute();
引发的异常是:
Syntax error, unexpected token SELECT, near to ' distinct 1 from ['Models'Preapproval] where ['Models'Preapproval].application_id = a.id)', when parsing: SELECT [a].* FROM ['Models'Application] AS [a] WHERE not exists (select distinct 1 from ['Models'Preapproval] where ['Models'Preapproval].application_id = a.id) (190)
那么关于这个问题,我如何在 phql 中编写一个不存在的子句?
不幸的是,
Phalcon并不总是能够使用PhQL查询生成器解析复杂的查询。
但是,在这种特殊情况下,您可以执行左连接条件:
/** @var ModelManager $manager */
$manager = 'Phalcon'DI::getDefault()->getShared("modelsManager");
$data = $manager->createBuilder()
->columns(''Models'Application.*')
->from(''Models'Application')
->leftJoin(''Models'Preapproval', ''Models'Preapproval.application_id = 'Models'Application.id')
->andWhere(''Models'Preapproval.id IS NULL')
->getQuery()
->execute();
这可能会也可能不会对性能产生负面或正面影响,具体取决于数据库索引基数。
我也有类似的问题。您可以使用原始sql,左连接(在我的情况下,我不得不使用许多"join ON"条件),或者您可以尝试这样做