Laravel Eloquent 根据数据透视表字段条件获取多对多关系

Posted

技术标签:

【中文标题】Laravel Eloquent 根据数据透视表字段条件获取多对多关系【英文标题】:Laravel Eloquent Getting Many To Many Relations Per Pivot Table Field Condition 【发布时间】:2020-07-28 05:16:57 【问题描述】:

我对 Laravel 7 Eloquent 有疑问。我有 2 个由 many to many relation 加入的表。表用户通过pivot 表 PaymentModuleUser 连接到 PaymentModule。我需要在语句is_active = 1 的数据透视表上使用where。当我在我的模型中使用 toSQL() 时,SQL 返回了很好的结果,但是当我在 Controller 中检查我的 Eloquent Query 时,我恢复的数据忽略了我的 wherePivot 方法(从表中返回所有数据,忽略 is_active = 1 字段订阅者 = null 并让我这个用户.. 如果我的pivotWhere = null 不显示此用户,我必须这样做)。你能指出我的代码哪里出错了吗?

我的 UserTable 模型:

    public function subscriber()
        return $this->belongsToMany(PaymentsModule::class, 'payment_module_user', 'user_id')->withPivot('is_active');
    

我的控制器:

$users = User::with(['subscriber'=>function($query)

$query->wherePivot('is_active','=', 1);
])->get();

print_r($users);

【问题讨论】:

你的意思是返回所有用户吗?或返回所有订阅is_activite=0 我的意思是返回订阅过期的用户。 【参考方案1】:

在你的控制器中,尝试使用这个

$query->wherePivot('is_active', 1);

而不是,

$query->wherePivot('is_active','=', 1);

【讨论】:

【参考方案2】:

试试

$users = User::with('subscriber' => function($query) 
    $query->where('payment_module_user.is_active', 1);
)->get();

print_r($users);

数据透视表已经被 eloquent 加入,所以开始使用吧

找到它here。

【讨论】:

以上是关于Laravel Eloquent 根据数据透视表字段条件获取多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent - 查询数据透视表

如何在 laravel 5 中使用 Eloquent 更新数据透视表

Eloquent ORM / Laravel - 使用自定义数据透视表结构

Laravel Eloquent:我的数据透视表有关系

Laravel Eloquent group by 与数据透视表和关系

Laravel Eloquent 用于数据透视表,一个表有 2 个外键,另一个表有 1 个外键