我正在使用订阅系统。 Users
订阅了Activities
,但是Activities
拥有Options
(不同的定价选项)。因此Users
实际上是链接到Options
的,而Subscriptions
是联接表。
Activities
hasMany
Options
和Options
hasMany
Subscriptions
现在,我经常想要特定活动的Subscriptions
列表,而不管选项如何。我发现了
$activity = $this->Activities->get($id, ['contain' => 'Options.Subscriptions']);
...很好地获得了包含订阅的选项。怎么去掉容器中的Options
,以致只找到Subscriptions
?
答案 0 :(得分:3)
您必须放弃为该任务使用容纳的想法,这不是它们的工作方式,容纳将始终包含其他数据。
如果要根据可能与模型记录相关联的其他记录来检索模型记录,则应查询目标模型,即Subscriptions
,并考虑使用查询构建器的关联过滤方法,即{ {1}}和matching()
。
它应该很简单:
innerJoinWith()
这将创建具有用于关联的必需$query = $this->Activities->Options->Subscriptions
->find()
->matching('Options.Activities', function (\Cake\ORM\Query $query) use ($id) {
return $query->where([
'Activities.id' => $id
]);
});
连接的查询,以便它仅选择与与具有给定ID的活动相关联的选项相关联的订阅。
另请参见