问题描述
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'],]);