Я пытаюсь построить динамический поиск путем поиска модели и определенных столбцов в ее отношениях и вложенных отношениях. Пока это код, который я придумал
Класс, который я создал, имеет 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;
}
}
Задача ещё не решена.
Других решений пока нет …