CakePHP 3 - содержит только ассоциацию второго уровня - PullRequest
0 голосов
/ 07 октября 2018

Я работаю в системе подписки.Users подписаться на Activities, но Activities имеют Options (различные варианты цен).Таким образом, Users на самом деле связаны с Options, а Subscriptions действует как таблица соединения.

Activities hasMany Options и Options hasMany Subscriptions

Теперь я часто хочу список Subscriptions для конкретной деятельности, независимо от параметров.Я обнаружил, что

$activity = $this->Activities->get($id, ['contain' => 'Options.Subscriptions']);

... хорошо работает, чтобы получить параметры, которые в свою очередь содержат подписки.Как можно было бы исключить Options из содержимого, чтобы были найдены только Subscriptions?

2nd leven contain

1 Ответ

0 голосов
/ 07 октября 2018

Вам придется отказаться от идеи использования контейнеров для этой задачи, это не то, как они работают, контейнеры всегда будут включать дополнительные данные.

Если вы хотите получить моделиВ зависимости от других записей, которые могут быть связаны с ними, необходимо выполнить запрос к целевой модели, например, Subscriptions, и изучить использование методов фильтрации сопоставлений построителей запросов, а именно matching() и innerJoinWith().

* 1009.* Это должно быть так просто:
$query = $this->Activities->Options->Subscriptions
    ->find()
    ->matching('Options.Activities', function (\Cake\ORM\Query $query) use ($id) {
        return $query->where([
            'Activities.id' => $id
        ]);
    });

Это создаст запрос с необходимыми INNER объединениями для ассоциаций, чтобы он выбирал только подписки, связанные с опцией, связанной сдействие с указанным идентификатором.

См. также

...