Я не могу применить фильтрацию ко всем дочерним элементам, определенным в древовидном формате модели с механизмом активной загрузки
Вот мое определение модели (прекрасно работает):
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()
, чтобы я мог применять рекурсивные фильтры (которые будут применяться ко всем уровням)?
Что-то вроде, скажем:
PS: это невозможно, поскольку в качестве параметра принимается только обратный вызов
public function children($parameters)
{
return $this->hasMany(
self::class,
'IdParent',
'Id'
)->with('children'=>$parameters);
}
То, что я не хотел бы использовать (в отношении SOLID принципы):
- Создание переменной класса stati c, которая содержит критерии
- Глобальная переменная любого вида