我有一个模型——让我们称之为<代码>父代码>。
每个父
可以有很多孩子。
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')和-
您可以使用以下查询
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
属性时,才会进行查询,而不是在获取所有父对象时。