如何通过关联数据过滤包含?

时间:2017-03-30 13:19:23

标签: cakephp associations filtering query-builder cakephp-3.x

我希望只有在第二级关联数据符合给定条件时才能关联。

查询可能更好地解释我尝试做的事情。

$selSite = $this->Sites->get($selSiteId, [
    'contain' => [
        'Agplans.Products' => function ($q) {
            return $q
            ->where([
                'Products.type' => 'hosting',
            ]);
        }
    ]
]);

所以,只有当相关产品符合条件时,我才会期待agplan

但结果是:

'agplans' => [
    (int) 0 => object(App\Model\Entity\Agplan) {

        'id' => (int) 20,
        'product_id' => (int) 4,
        'product' => null,
        ...,

    },
    (int) 1 => object(App\Model\Entity\Agplan) {

        'id' => (int) 21,
        'site_id' => (int) 64,
        'product_id' => (int) 75,
        'product' => object(App\Model\Entity\Product) {

            'id' => (int) 75,
            ...,

        },
        ...,

    }
],

我的问题是让agplan[0]获得product => null。 这不是我从doc中理解的。 如何仅使用agplan获取'product' => object(App\Model\Entity\Product)

1 个答案:

答案 0 :(得分:1)

所以感谢@ndm指出的我理解我必须像这样构建我的查询:

$selSite = $this->Sites->get($selSiteId, [
    'contain' => [
        'Agplans.Products',
        'Agplans' => function ($q) {
            return $q
            ->matching('Products', function ($q) {
                return $q
                ->where([
                    'type' => 'hosting',
                ]);
            });
        }
    ]
]);

这样,我只会agplans匹配给定的product。 无论如何,我发现CakePHP文档没有明确关于限制关联的包含功能。