Глубокий поиск по связям с красноречивыми моделями

Я пытаюсь построить динамический поиск путем поиска модели и определенных столбцов в ее отношениях и вложенных отношениях. Пока это код, который я придумал

Класс, который я создал, имеет queryFields константа, которая содержит все поля базовой модели (Client) для поиска. Любой массив в этой константе является связью с соответствующими полями для поиска. и так далее.

queryWhereBuilder Метод должен искать рекурсивно через все эти поля, но я не могу заставить его работать должным образом. Он считает, что вложенные отношения являются отношениями базовой модели.

Я хотел бы знать, если это идеальный способ сделать это или есть лучший способ.

class SearchBuilder {
const CC = Client::class;
const queryFields = [
'id',
'name',
'phone',
'email',
'address',
'details'=>[
'former_id'
],
'invoices'=>[
'reference',
'receipts'=>[
'description',
'reference'
]
]
];

protected $builder;

public function __construct()
{
$this->builder =  (static::CC)::query();
}

protected function queryWhereBuilder($search, $fields = null, $builder = null, $whereHas = false)
{
$builder = $builder ?: $this->builder;
$fields = $fields ?: static::queryFields;
foreach ($fields as $field => $value) {
if (!$whereHas) {
if (!is_array($value) && $field === 0){
$builder = $builder->where($value, 'like', "%".$search."%");
}
elseif(is_array($value)){
$builder = $this->queryWhereBuilder($search, $value, $builder, $field);
}
else{
$builder = $builder->orWhere($value, 'like', "%".$search."%");
}
}
else{
if (!is_array($value) && $field === 0) {
$builder = $builder->whereHas($whereHas, function($query) use ($search,$value){
$query->where($value, 'like', "%".$search."%");
});
} elseif(is_array($value)) {

$builder = $this->queryWhereBuilder($search, $value, $builder, $field);
}
else{
$builder = $builder->orWhereHas($whereHas, function($query) use ($search,$value){
$query->orWhere($value, 'like', "%".$search."%");
});
}
}
}
return $builder;
}
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]