在 Laravel 中,whereHas
方法用于在关联模型上添加查询条件。全局作用域(Global Scopes)则是一种在模型上定义全局约束的方式,这些约束会自动应用于模型的所有查询。将 whereHas
与全局作用域结合使用,可以在多个地方重用相同的查询逻辑,从而提高代码的可维护性和可读性。
whereHas
方法用于在关联模型上添加查询条件。它允许你在主模型上定义条件,以过滤与其关联的子模型。Scope
类的组合,可以创建更复杂的全局作用域,以满足更复杂的查询需求。假设我们有一个 Post
模型和一个 User
模型,它们之间存在一对多的关系。我们希望在查询帖子时,只获取那些作者活跃的用户发布的帖子。
首先,在 User
模型中定义一个全局作用域:
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class User extends Model
{
// ...
public static function boot()
{
parent::boot();
static::addGlobalScope(new ActiveUserScope);
}
}
class ActiveUserScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder->where('is_active', 1);
}
}
然后,在 Post
模型中使用 whereHas
方法结合全局作用域:
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
// ...
public function user()
{
return $this->belongsTo(User::class);
}
public function scopeActiveUserPosts($query)
{
return $query->whereHas('user');
}
}
最后,在控制器中使用这个作用域:
use App\Models\Post;
class PostController extends Controller
{
public function index()
{
$posts = Post::activeUserPosts()->get();
return view('posts.index', compact('posts'));
}
}
如果在重构 whereHas
以通过全局作用域使用时遇到问题,可能是由于以下原因:
addGlobalScope
方法,并且全局作用域类实现了 Scope
接口。apply
方法,确保它正确地修改了查询构建器实例。whereHas
方法中的参数一致。通过以上步骤和示例代码,你应该能够成功地将 whereHas
与全局作用域结合使用,从而提高代码的可维护性和可读性。
领取专属 10元无门槛券
手把手带您无忧上云