在 Phalcon Framework 中使用不存在的 Phql

Using not exists with Phql in Phalcon Framework

我正在尝试使用 phql 编写一个简短的查询。我从一个 table 中选择所有内容,并且有一个 where 子句声明另一个 table 不能有连接到这个 table 的记录。这是原始 sql 查询,当 运行 对我的数据库 Mysql.

时工作正常
select * from application a
where not exists (select distinct 1 from preapproval p where p.application_id = a.id)

所以为了尝试在 phql 中写这篇文章,我一直在尝试不同的东西,但这是我最终得到的。

注意:如果我 运行 这没有 where 子句它起作用,从 'application' table.

中选择所有记录
$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 子句?

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

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

我遇到了类似的问题。您可以使用 raw sql, left joins (in my case i had to use many 'join ON' conditions) or you can try this