Условно связанные модели с детскими моделями CakePHP - PullRequest
0 голосов
/ 06 июня 2018

У меня следующая структура базы данных:

// 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'
        ]
    ]);

Но затем я получаю ошибку {{Неподдерживаемые типы операндов}}.И документы на самом деле не говорят, что вы должны делать, если вы хотите условие и содержимое.

Как бы я это сделал?

РЕДАКТИРОВАТЬ: Я хочуданные должны выглядеть так:

Job 1:
     Accepted by John Doe
     Accepted by Jane Doe
Job 2:
     Accepted by Foo Bar
Job 3:
     Nobody accepted

1 Ответ

0 голосов
/ 07 июня 2018

Вы используете неправильный "синтаксис", вы не можете просто передать вызываемое в массиве параметров.

Далее в документах, которые вы связали, есть пример того, как вложить построители запросов ипройти дополнительные условия ... опция 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']);
    }
])

См. Также

...