Php Phalcon框架中的Phql不存在使用

Php Phalcon框架中的Phql不存在使用,php,phalcon,Php,Phalcon,我正试图写一个简短的查询。我正在从一个表中选择所有内容,并且有一个where子句声明另一个表不能有连接到此表的记录。这是一个原始sql查询,在运行my db(即Mysql)时效果良好 select * from application a where not exists (select distinct 1 from preapproval p where p.application_id = a.id) 所以我试着写这篇文章,我尝试了不同的东西,但我最终得到的是 注意:如果我在没有wher

我正试图写一个简短的查询。我正在从一个表中选择所有内容,并且有一个where子句声明另一个表不能有连接到此表的记录。这是一个原始sql查询,在运行my db(即Mysql)时效果良好

select * from application a
where not exists (select distinct 1 from preapproval p where p.application_id = a.id)
所以我试着写这篇文章,我尝试了不同的东西,但我最终得到的是

注意:如果我在没有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)

因此,关于这个问题,如何在中编写where not exists子句?

不幸的是,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();

这可能会也可能不会对性能产生负面或正面影响,具体取决于数据库索引基数。

我也遇到过类似的问题。您可以使用左连接(在我的例子中,我必须使用许多“连接条件”),也可以使用

这与我最终所做的基本相同,我接受这个答案。我想这是最接近我们找到好的解决方案的时候了。谢谢你的回答。