Laravel 5.4多对多关系查询

时间:2017-05-16 19:27:15

标签: laravel laravel-5 eloquent laravel-5.4

我试图搜索此问题,但不知道如何正确地说出来。 所以,我有3张桌子。 '品种','breed_features'和数据透视表'breed_breed_feature' 我正在尝试获得所有选择了breed_features的品种。 我正在从一个数组中将breed_feature id-s传递给控制器​​。 我的关系设置正确,所以我可以获得所有$ breed->功能 和所有$ feature->品种。

我尝试了什么:

$featureids = request('features');

$breeds = Breed::with('features')->whereHas('features', function($q) use ($featureids)
{
    $q->whereIn('breed_feature_id', $featureids);
})->get();
dd($breeds);

结果是所有具有至少1个特征id-s的品种

$featureids = request('features');

$breeds = Breed::with('features')->whereHas('features', function($q) use ($featureids)
{
    $q->where('breed_feature_id', $featureids);
})->get();
dd($breeds);

结果返回所有在数组中具有第一个id的要素的品种,查询甚至不会尝试传递其余的ID。

$featureids = request('features');

$breeds = Breed::with('features')->whereHas('features', function($q) use ($featureids)
{
    foreach ($featureids as $f)
    {
        $q->where('breed_feature_id', $f);
    }
})->get();
dd($breeds);

如果我只传递1个id来查询,结果返回正确的品种,如果我传递的数量超过1,它总是返回空集合。

请帮助。

1 个答案:

答案 0 :(得分:0)

好的,我完全没有办法解决这个问题。它有效,但我很确定,必须有更好的方法来做到这一点。

 $features = BreedFeature::findMany(request('features'));
    $breeds = Breed::with('features')->wherehas('features')->get();
    foreach($features as $f)
    {
        $breeds = $breeds->intersect($f->breeds);
    }

因此,我从表单中的ID-s获取数据库中的所有功能。 然后我从数据库中获取所有品种。 然后我将开始与$ feature->品种交叉$品种集合。 会对它进行更多的测试,但现在看起来效果还不错。