深入搜索关系雄辩的模型

时间:2017-09-24 14:20:58

标签: php laravel recursion eloquent recursive-query

我正在尝试通过在其关系和嵌套关系中搜索模型和特定列来构建动态搜索。到目前为止,这是我提出的代码

我创建的类有一个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 个答案:

没有答案
相关问题