首页 > 解决方案 > 如何在laravel多对多关系中匹配数据透视表的确切行数?

问题描述

我有表 A、B、AB,这是一个数据透视表,我也为它们创建了各自的关系。现在,当我想获取与数据透视表完全匹配的 id(数组)的数据时。

$idArray = [3,4]


Model_A::whereHas('b', function($q) use ($idArray) {
        $q->whereIn('b.id', $idArray);  
    })
->with(
    [   
        'b' => function($q) use ($idArray) {
            $q->whereIn('b.id', $idArray);
        },
    ]
)
->get();

使用 whereIn 即使匹配数组中的一个 id 但我想匹配确切的 id。

示例集合:

[
    0 : {
        sample_data,
        B:[
            0:{
                sample_data,
                id:2
            },
            1:{
                sample_data,
                id:3
            },
            2:{
                sample_data,
                id:4
            }

        ]
    },
    1 : {
        sample_data,
        B:[
            0:{
                sample_data,
                id:3
            },
            1:{
                sample_data,
                id:4
            },
            2:{
                sample_data,
                id:5
            }

        ]
    },
    2 : {
        sample_data,
        B:[
            0:{
                sample_data,
                id:3
            },
            1:{
                sample_data,
                id:4
            },
        ]
    },
    3 : {
        sample_data,
        B:[
            0:{
                sample_data,
                id:3
            },
            1:{
                sample_data,
                id:4
            },
        ]
    }

]

现在我只想要以下结果$idArray = [3,4]

[
    0 : {
        sample_data,
        B:[
            0:{
                sample_data,
                id:3
            },
            1:{
                sample_data,
                id:4
            },
        ]
    },
    1 : {
        sample_data,
        B:[
            0:{
                sample_data,
                id:3
            },
            1:{
                sample_data,
                id:4
            },
        ]
    }

]

在此处输入图像描述 在上图中,我使用 $idArray = [1,5] 获取目的地(数据透视表)的数据,它也获取目的地 1,5 和 1 的数据,但我只想获取两个目的地都有 1,5 的数据。不仅有 1 个或只有 5 个,而且两者都有,但也不喜欢 1、5、6 等

标签: laraveleloquentmany-to-many

解决方案


查看使用辅助函数查询关系存在的文档wherehas

使用该函数,如果它与表 B 有关系,则只能从表 A 中提取,而表 B 将从表 B 中获取确切的 ID。像这样:

$idArray = [3,4]

A_Model::whereHas('b', function($query) use ($idArray){
    $query->whereIn('id', $idArray);
})
->with(['B'=>function($q) use ($idArray) {
    $q->whereIn('B.id', $idArray)
}])
->get();


推荐阅读