CakePHP 3 - 仅包含二级关联
CakePHP 3 - Contain only second-level association
我正在开发订阅系统。 Users
订阅了 Activities
,但 Activities
订阅了 Options
(不同的定价选项)。所以 Users
实际上链接到 Options
,Subscriptions
充当连接 table.
Activities
hasMany
Options
和 Options
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 关联的选项关联的订阅。
另见
- Cookbook > Database Access & ORM > Query Builder > Filtering by Associated Data
- How to filter by conditions for associated models?
我正在开发订阅系统。 Users
订阅了 Activities
,但 Activities
订阅了 Options
(不同的定价选项)。所以 Users
实际上链接到 Options
,Subscriptions
充当连接 table.
Activities
hasMany
Options
和 Options
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 关联的选项关联的订阅。
另见
- Cookbook > Database Access & ORM > Query Builder > Filtering by Associated Data
- How to filter by conditions for associated models?