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();
喜欢的选项使用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();
我的 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();
喜欢的选项使用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();