在 Phalcon Framework 中使用 not exists 与 Phql


Using not exists with Phql in Phalcon Framework

我正在尝试用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"条件),或者您可以尝试这样做