【发布时间】:2020-03-12 11:53:01
【问题描述】:
我似乎无法对以树模型格式定义的所有子节点应用过滤带有急切加载机制
这是我的模型定义(效果很好):
class Section extends Model
{
[...]
/**
* @return HasOne
*/
public function parent()
{
return $this->hasOne(
self::class,
'Id',
'IdParent'
)->with('parent');
}
/**
* @return HasMany
*/
public function children()
{
return $this->hasMany(
self::class,
'IdParent',
'Id'
)->with('children');
}
[...]
}
现在我想根据“条件对象”过滤掉递归
public function getMachines(SectionCriteria $sectionCriteria = NULL)
{
/**
* @var $builder Builder|Section
*/
$builder = Section::with([
'children' => function ($query) use ($sectionCriteria) {
if ($sectionCriteria) {
foreach ($sectionCriteria->getFilterFlags() as $flagName => $flagValue) {
if ($flagValue) {
$query->whereFlag($flagName); //Custom implementation
} else {
$query->whereNotFlag($flagName); //Custom implementation
}
}
}
}
]);
这适用于树的第一级。
我的问题是:有没有办法将对象传递给children() 关系,以便我可以递归应用过滤器(适用于所有级别)?
比如说:
P.S:这是不可能的,因为只接受一个回调作为参数
public function children($parameters)
{
return $this->hasMany(
self::class,
'IdParent',
'Id'
)->with('children'=>$parameters);
}
我不想使用的东西(关于 SOLID 原则):
- 创建一个包含标准的静态类变量
- 任何类型的全局变量
【问题讨论】: