Laravel : 如何在具有多对多模型关系的模型上添加条件子句?

Laravel : How to add conditional clause on a model having Many to Many model relationship?

我的 User 模型上有这个方法。

public function reviews()
{
    return $this->belongsToMany(Review::class, 'review_user')->withTimestamps();
}

及其在 Review 模型处的逆函数。


public function reviewers()
{
   return $this->belongsToMany(User::class, 'review_user')->withTimestamps();
}

它们通过枢轴 table review_user 连接,结构如下。

$table->id();
// User ID
$table->unsignedBigInteger('user_id')->nullable();
$table->foreign('user_id')
    ->references('id')
    ->on('users');

// Review ID
$table->unsignedBigInteger('review_id')->nullable();
$table->foreign('review_id')
    ->references('id')
    ->on('reviews');

$table->timestamps();

评论模型有一个布尔列 status

我想要的是状态为 true?

的用户所有评论

我已经能够使用 Auth::user()->reviews()->get();

实现 users all reviews

如何添加可以按状态列过滤的 where 子句?

您可以通过使用 scope 或使用额外的 Where 子句定义相同的关系来实现此目的

使用关系:

public function Activereviews()
{
    return $this->belongsToMany(Review::class, 'review_user')
     ->whereStatus(true)
     ->withTimestamps();
}

或使用范围:

public function scopeActivereviews()
{
    return $this->reviews()
     ->whereStatus(true);
}

现在您可以:

Auth::user()->ActiveReviews()->get();

希望对您有所帮助。

谢谢

像那样尝试此代码,确实有效

$reviews = auth()->user()->whereHas('reviews', function ($query) {
   return $query->where('status', '=', true);
})->get();

然后你检查 the official documentation

喜欢的选项使用documentation

Like all other relationship types, you may call the roles method to continue chaining query constraints onto the relationship:

$roles = App\User::find(1)->roles()->orderBy('name')->get();