我正在尝试通过在其关系和嵌套关系中搜索模型和特定列来构建动态搜索。到目前为止,这是我提出的代码
我创建的类有一个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;
}
}