CakePHP 3 - 仅包含二级关联

CakePHP 3 - Contain only second-level association

我正在开发订阅系统。 Users 订阅了 Activities,但 Activities 订阅了 Options(不同的定价选项)。所以 Users 实际上链接到 OptionsSubscriptions 充当连接 table.

Activities hasMany OptionsOptions hasMany Subscriptions

现在我经常想要一个 Subscriptions 的列表,用于特定的 activity,而不考虑选项。我发现

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

...可以很好地获取包含订阅的选项。如何从包含中省略 Options,以便只找到 Subscriptions

您将不得不放弃为该任务使用容器的想法,它们不是这样工作的,容器将始终包含[​​=27=]额外 数据。

如果你想根据可能与它们关联的其他记录检索模型记录,那么你应该查询目标模型,即 Subscriptions,并研究使用查询构建器关联过滤方法,即 matching()innerJoinWith().

它应该很简单:

$query = $this->Activities->Options->Subscriptions
    ->find()
    ->matching('Options.Activities', function (\Cake\ORM\Query $query) use ($id) {
        return $query->where([
            'Activities.id' => $id
        ]);
    });

这将创建一个查询,其中包含关联所需的 INNER 连接,因此它只选择与具有给定 ID 的 activity 关联的选项关联的订阅。

另见