在多对多关系中使用“And Where”

Posted

技术标签:

【中文标题】在多对多关系中使用“And Where”【英文标题】:using 'And Where' in Many to Many relation 【发布时间】:2021-02-18 00:44:16 【问题描述】:

我有两个具有多对多关系的模型。

class User extends Model

    function cars()
    
        return $this->belongsToMany(Car::class);
    


class Car extends Model

    function users()
    
        return $this->belongsToMany(User::class);
    

我想获得使用特定汽车的用户:

$car_selected = [1, 3, 6];

$users = User::when(count($car_selected) > 0, function ($q) use ($car_selected) 
    $q->whereIn('cars.id', $car_selected);
)
    ->get();

由于 'whereIn' 条件,这给出了太多结果;我想要的是 'whereAnd' 的东西。

我试过了,但没有运气。

$users = User::when(count($car_selected) > 0, function ($q) use ($car_selected) 
    foreach($car_selected as $xx) 
        $q->where( 'cars.id', $xx);
    
)
    ->get();

如何获取与汽车 1、3 和 6 有关系的所有用户?

【问题讨论】:

【参考方案1】:

您提供的代码没有多大意义,但根据您的解释,您希望找到与汽车 1 3 有关系的用户> 6. 使用whereIn() 让您的用户与汽车 1 3 6有关系。

您尝试使用多个where() 过滤器将不起作用,因为这将在数据透视表中查找包含多辆汽车的单行,这显然是不可能的。相反,您需要将多个 whereHas() relationship filters 嵌套到 a single where() group 中,如下所示:

$users = User::where(function ($q) use ($car_selected) 
    foreach ($car_selected as $car) 
        $q->whereHas('cars', function ($query) use ($car) 
            $query->where('car_id', $car);
        );
    
)
    ->with(['cars' => function ($q) use ($car_selected) 
        $q->whereIn('car_id', $car_selected);
    ])
    ->get();

这一切都假设你已经按照 Laravel 标准正确设置了关系和表格。

演示代码在这里:https://implode.io/anjLGG

【讨论】:

是的,这就是我想要的......是的,这是我的案例的答案。谢谢你.. 对此感到抱歉。我在这里几乎是新手..我找不到接受您的答案的方法..我也看不到✅。并且有某人的错误回复作为答案。我可以说我没有接受那个错误的代码。我事件评论说这是不正确的。无论如何,很抱歉给了某种伤害……但无论如何都不能接受你的伤害。这就是为什么我评论了你的 ID 和答案。如果你让我知道如何纠正这个问题,我会这样做。谢谢。【参考方案2】:

可以使用whereHas方法查询关系:

use Illuminate\Database\Eloquent\Builder;

    User::whereHas('cars', function (Builder $builder) use($car_selected)
            
                $builder->whereIn( 'cars.id', $car_selected);
            )->get();

欲了解更多信息,请查看doc

【讨论】:

感谢您的回复.. 但这就是我现在想要的。使用“WhereIn”无法获得相交的行。请仔细阅读我的问题.. 那么您所说的 'This give Combination because of 'whereIn' condition' 是什么意思。你面临什么问题?【参考方案3】:

正如@miken32 解释的那样,我需要将多个 whereHas() 关系过滤器嵌套到一个 where() 组中。

@miken32 提出以下建议..


$users = User::where(function ($q) use ($car_selected) 
    foreach ($car_selected as $car) 
        $q->whereHas('cars', function ($query) use ($car) 
            $query->where('car_id', $car);
        );
    
)
    ->with(['cars' => function ($q) use ($car_selected) 
        $q->whereIn('car_id', $car_selected);
    ])
    ->get();

我想跟随就足够了。


$users = User::where(function ($q) use ($car_selected) 
    foreach ($car_selected as $car) 
        $q->whereHas('cars', function ($query) use ($car) 
            $query->where('car_id', $car);
        );
    
)->get();

谢谢。

【讨论】:

以上是关于在多对多关系中使用“And Where”的主要内容,如果未能解决你的问题,请参考以下文章

学说2:在多对多关系中引用连接表

春季 JPA |在多对多关系中搜索

如何在多对多关系中使用带有可编辑字段的 TabularInline?

如何在多对多关系中更新日期

实体框架在多对多关系中重复条目

在多对多关系中命名表 laravel