带有儿童模型CakePHP的条件相关模型

时间:2018-06-06 17:42:48

标签: php cakephp associations query-builder cakephp-3.x

我有以下数据库结构:

// 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

1 个答案:

答案 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']);
    }
])

另见