在带有预加载的查询构建器中使用 OR

Using OR in the query builder with eager loading

蛋糕PHP版本:4.1.4

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

SQL
我在 xampp 环境中使用 10.4.14-MariaDB 作为数据库服务器和 PHP 版本 7.4.10。下面查询 returns 想要的结果集 when 运行 in 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

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

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

尝试 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

尝试 3

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

尝试 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]]
        ]);
});

尝试摘要
None 我的尝试 return 编辑了所需的结果集。如果我删除 OR 条件,则预期结果集为 returned.

问题
我如何构建上面的 SQL 查询,它使用查询生成器 return 所需的结果集。

谢谢 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,'Tasks.account_id' => 1393, 
        'OR' => [
            ['Users.authorised' => 'yes'],
            ['Users.area_id' => 1346],
        ],
    ]);