我试图用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中编写where not exists子句?
答案 0 :(得分:2)
不幸的是,Phalcon并不总是能够使用PhQL查询构建器解析复杂查询。
但是在这种特殊情况下,您可以使用条件执行leftJoin:
/** @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();
根据您的数据库索引基数,这可能会对性能产生负面或正面影响。
答案 1 :(得分:0)