提问者:小点点

Laravel 8:我可以做一个有说服力的范围,但不是针对查询生成器,而是针对相关模型吗?


我有一个模型——让我们称之为<代码>父

每个可以有很多孩子。

public function children(): HasMany
{
    return $this->hasMany(Child::class, 'parent_id', 'id');
}

我想为Parent创建一个称为“active”的作用域。

我的要求如下:

至少有一个子项时,父项处于活动状态。

我做过多次局部作用域,我知道在Parent中。php我可以执行以下操作:

public function scopeActive($query)
{
    return $query->where(…);
}

但正如您所看到的,$query是一个\illumb\Database\elount\Builder,这与我的情况不同。我想以某种方式操作相关模型,而不是DB查询。

我是否可以以干净的方式执行此操作,而不必使用('child')和-


共3个答案

匿名用户

您可以使用以下查询

public function scopeActive($query)
{
    return $query->has('children');
}

匿名用户

一种选择是在范围内使用whereHas

public function scopeActive($query){
  return $query->whereHas('children');
}

public function scopeActive(){
  return $this->whereHas('children');
}

而且

Parent::active()->with('children')->get();

应该给你所有有孩子的父母和各自的孩子

匿名用户

你能试试这样的东西吗

public function getActiveAttribute() {
  return $this->children()->count() > 1;
}

可以这样使用,

$parent->active

只有当您尝试访问Parent模型上的active属性时,才会进行查询,而不是在获取所有父对象时。