在Phalcon Framework中使用Phql不存在

时间:2015-01-23 09:28:40

标签: php phalcon

我试图用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子句?

2 个答案:

答案 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)

我有类似的问题。您可以使用raw sql,左连接(在我的情况下,我必须使用许多'加入ON'条件),或者您可以try this