CakePHP 3-仅包含第二级关联

时间:2018-10-07 14:19:13

标签: cakephp associations cakephp-3.0 query-builder

我正在使用订阅系统。 Users订阅了Activities,但是Activities拥有Options(不同的定价选项)。因此Users实际上是链接到Options的,而Subscriptions是联接表。

Activities hasMany OptionsOptions hasMany Subscriptions

现在,我经常想要特定活动的Subscriptions列表,而不管选项如何。我发现了

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

...很好地获得了包含订阅的选项。怎么去掉容器中的Options,以致只找到Subscriptions

2nd leven contain

1 个答案:

答案 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的活动相关联的选项相关联的订阅。

另请参见