在查询构建器中使用OR进行急切加载

问题描述

CakePHP版本:4.1.4

简介
我正在尝试使用查询生成器来构建复杂的where子句并使用预先加载。

sql
我在xampp环境中使用10.4.14-MariaDB作为数据库服务器和PHP 7.4.10版本。在xampp中运行时,以下查询返回所需的结果集。

SELECT *
FROM
    tasks
JOIN users ON
    users.id = tasks.user_id
WHERE tasks.status = 1
AND tasks.account_id = 1393
AND users.authorised' = 'yes'
OR users.area_id = 1346;

我为尝试1和2所引用的信息可以在here中找到。

ATTEMPT 1
我通常在查询构造中使用where和wherewhere,所以我的第一次尝试是:

$query = $Tasks->find()
    ->contain(['Users'])
    ->where([
        'Tasks.status' => 1,])
    ->andWhere([
        'Tasks.account_id' => 1393,'Users.authorised' => 'yes','OR' => [['Users.area_id' => 1346]]
    ]);

ATTEMPT 2

$query = $Tasks->find()
    ->contain(['Users'])
    ->where(['Tasks.status' => 1])
    ->where(['Tasks.account_id' => 1393])
    ->where([
        'Users.authorised' => 'yes'
        'OR' => [['Users.area_id' => 1346]]
    ]);

我在尝试3和4中引用的信息可以在here中找到。

ATTEMPT 3

$query = $Tasks->find()->contain('Users',function (Query $q) {
    return $q
        ->where(['Tasks.status' => 1])
        ->andWhere([
            'Tasks.account_id' => 1393,'OR' => [['Users.area_id' => 1346]]
        ]);
});

ATTEMPT 4

$query = $Tasks->find()->contain('Users',function (Query $q) {
    return $q
        ->where(['Tasks.status' => 1])
        ->where(['Tasks.account_id' => 1393])
        ->where([
            'Users.authorised' => 'yes','OR' => [['Users.area_id' => 1346]]
        ]);
});

尝试摘要
我的尝试均未返回所需的结果集。如果删除OR条件,则返回预期结果集。

问题
我该如何构造上面的SQL查询,但确实可以使用查询生成器返回所需的结果集。

感谢Z。

解决方法

我不确定您想要哪种查询,这是两个示例:

// WHERE (tasks.status = 1 AND tasks.account_id = 1393 AND users.authorised' = 'yes') OR users.area_id = 1346;

$query = $Tasks->find()
    ->contain(['Users'])
    ->where([
        'OR' => [
            ['Tasks.status' => 1,'Tasks.account_id' => 1393,'Users.authorised' => 'yes'],['Users.area_id' => 1346],],]);

// WHERE tasks.status = 1 AND tasks.account_id = 1393 AND (users.authorised' = 'yes' OR users.area_id = 1346);

$query = $Tasks->find()
    ->contain(['Users'])
    ->where([
        'Tasks.status' => 1,'OR' => [
            ['Users.authorised' => 'yes'],]);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...