【问题标题】:Laravel 5.4 many to many relationship queryLaravel 5.4 多对多关系查询
【发布时间】:2017-05-16 19:27:14
【问题描述】:

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

我尝试了什么:

$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 个,它总是返回空集合。

请帮忙。

【问题讨论】:

  • 选项 3 为空,因为您尝试搜索将 breed_feature_id 设置为 1、2、3、4 的品种,例如如果你通过超过 1 个但每个品种只有 1 个breed_feature_id。大约一年前,我遇到了类似的问题,并且能够通过使用whereHas 3 次或使用reject 来解决它。

标签: laravel laravel-5 eloquent laravel-5.4


【解决方案1】:

好的,我完全以其他方式解决了这个问题。它有效,但我很确定,一定有更好的方法来做到这一点。

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

所以我通过表单中的 ID 从数据库中获取所有功能。 然后我从数据库中获取所有品种。 然后我将开始将 $breeds 集合与 $feature->breeds 相交。 将对其进行更多测试,但它现在似乎工作得很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-02
    • 2015-05-29
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 2019-01-04
    • 2019-02-07
    • 2017-11-03
    相关资源
    最近更新 更多