我有以下数据库结构:
// Contacts
,----,------------,------------------,
| id | name | email |
|----|------------|------------------|
| 1 | John Doe | john@example.com |
'----'------------'------------------'
// Jobs
,----,------------,-------------------,
| id | title | description |
|----|------------|-------------------|
| 1 | Fancy Job | This job is fancy |
'----'------------'-------------------'
// JobRequests
,----,------------,------------,----------,
| id | job_id | contact_id | accepted |
|----|------------|------------|----------|
| 1 | 1 | 1 | yes |
| 2 | 1 | 2 | no |
'----'------------'------------'----------'
我希望所有接受工作的联系人。
我尝试过以下操作:
$jobs = $this->Jobs
->find('all')
->where(['event_id' => $id])
->contain([
'JobRequests' => [
function(Query $query) {
return $query->where(['JobRequests.accepted' => 'yes']);
},
'Contacts'
]
]);
但后来我得到{{Unsupported operand types}}错误。如果你想要一个条件和一个包含,那么docs就不会说你应该做什么。
我该怎么做?
编辑: 我希望数据看起来像这样:
Job 1:
Accepted by John Doe
Accepted by Jane Doe
Job 2:
Accepted by Foo Bar
Job 3:
Nobody accepted
答案 0 :(得分:1)
您使用了错误的“语法”,您不能只在选项数组中传递可调用的内容。
在下面的文档中,您已经链接了一个示例,如何嵌套查询构建器并传递其他条件...... queryBuilder
选项:
->contain([
'JobRequests' => [
'queryBuilder' => function(Query $query) {
return $query->where(['JobRequests.accepted' => 'yes']);
},
'Contacts'
]
])
堆叠包含也应该有效:
->contain([
'JobRequests' => function(Query $query) {
return $query->where(['JobRequests.accepted' => 'yes']);
},
'JobRequests.Contacts'
])
嵌套也应该有效:
->contain([
'JobRequests' => function(Query $query) {
return $query
->where(['JobRequests.accepted' => 'yes'])
->contain(['Contacts']);
}
])
另见