【问题标题】:CakePHP 3 - Contain only second-level associationCakePHP 3 - 仅包含二级关联
【发布时间】:2019-03-12 08:44:06
【问题描述】:

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

ActivitieshasManyOptionsOptionshasManySubscriptions

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

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

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

【问题讨论】:

    标签: cakephp associations cakephp-3.0 query-builder


    【解决方案1】:

    您将不得不放弃使用容器来完成该任务的想法,这不是它们的工作方式,容器将始终包含附加数据。

    如果您想根据可能与它们关联的其他记录来检索模型记录,那么您应该查询目标模型,即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 的活动关联的选项关联的订阅。

    另见

    【讨论】:

    • 啊,matching 显然是我正在寻找的关键字。您是否愿意扩展您对如何获取包含订阅计数的文章列表的答案?
    • Nvm,找到了。我已将其添加到您的答案中,希望您不要介意。
    • @Roberto 这是一项不同的任务,即它超出了您原始问题的范围,所以我认为它不属于这个答案。此特定任务的问题和答案已经存在,例如 stackoverflow.com/questions/42254790/…
    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 2016-03-16
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多