Php 通过Laravel中的特征搜索多个列

Php 通过Laravel中的特征搜索多个列,php,laravel,laravel-5.4,Php,Laravel,Laravel 5.4,通过签出,我在我的Laravel 5.4应用程序中实现了一个搜索url。我已经在我的模型中实现了一个特性,例如,如果我有公司模型,那么在模型中,我包括了我的特性,如下所示: class Company extends Model { use SoftDeletes, DataViewer; protected $fillable = [ 'name', 'address', 'city', 'state', 'country', 'type', 'sub_typ

通过签出,我在我的
Laravel 5.4
应用程序中实现了一个搜索url。我已经在我的模型中实现了一个特性,例如,如果我有公司模型,那么在模型中,我包括了我的特性,如下所示:

class Company extends Model
{
    use SoftDeletes, DataViewer;

    protected $fillable = [
        'name', 'address', 'city', 'state', 'country', 'type', 'sub_type',
    ];

    public static $columns = [
        'name', 'address', 'city', 'type', 'sub_type'
    ];
}
trait DataViewer {

    protected $operators = [
        'equal' => '=',
        'not_equal' => '<>',
        'less_than' => '<',
        'greater_than' => '>',
        'less_than_or_equal_to' => '<=',
        'greater_than_or_equal_to' => '>=',
        'in' => 'IN',
        'like' => 'LIKE'
    ];

    public function scopeSearchPaginateAndOrder($query)
    {
        $request = app()->make('request');

        return $query
            ->orderBy($request->column, $request->direction)
            ->where(function($query) use ($request) {
                if($request->has('search_input')) {
                    if($request->search_operator == 'in') {
                        $query->whereIn($request->search_column, explode(',', $request->search_input));
                    } else if($request->search_operator == 'like') {
                        $query->where($request->search_column, 'LIKE', '%'.$request->search_input.'%');
                    }
                    else {
                        $query->where($request->search_column, $this->operators[$request->search_operator], $request->search_input);
                    }
                }
            })
            ->paginate($request->per_page);
    }

}
public function getData()
{
    $models = Company::searchPaginateAndOrder();
    return response()->json([
        'model' => $models
    ]);
}
http://stellar.dev/api/companies?column=name&direction=asc&page=1&per_page=50&search_column=name&search_operator=like&search_input=icici
现在我有了这样的
DataViewer
特征:

class Company extends Model
{
    use SoftDeletes, DataViewer;

    protected $fillable = [
        'name', 'address', 'city', 'state', 'country', 'type', 'sub_type',
    ];

    public static $columns = [
        'name', 'address', 'city', 'type', 'sub_type'
    ];
}
trait DataViewer {

    protected $operators = [
        'equal' => '=',
        'not_equal' => '<>',
        'less_than' => '<',
        'greater_than' => '>',
        'less_than_or_equal_to' => '<=',
        'greater_than_or_equal_to' => '>=',
        'in' => 'IN',
        'like' => 'LIKE'
    ];

    public function scopeSearchPaginateAndOrder($query)
    {
        $request = app()->make('request');

        return $query
            ->orderBy($request->column, $request->direction)
            ->where(function($query) use ($request) {
                if($request->has('search_input')) {
                    if($request->search_operator == 'in') {
                        $query->whereIn($request->search_column, explode(',', $request->search_input));
                    } else if($request->search_operator == 'like') {
                        $query->where($request->search_column, 'LIKE', '%'.$request->search_input.'%');
                    }
                    else {
                        $query->where($request->search_column, $this->operators[$request->search_operator], $request->search_input);
                    }
                }
            })
            ->paginate($request->per_page);
    }

}
public function getData()
{
    $models = Company::searchPaginateAndOrder();
    return response()->json([
        'model' => $models
    ]);
}
http://stellar.dev/api/companies?column=name&direction=asc&page=1&per_page=50&search_column=name&search_operator=like&search_input=icici
为了实现这一点,我将url称为:

class Company extends Model
{
    use SoftDeletes, DataViewer;

    protected $fillable = [
        'name', 'address', 'city', 'state', 'country', 'type', 'sub_type',
    ];

    public static $columns = [
        'name', 'address', 'city', 'type', 'sub_type'
    ];
}
trait DataViewer {

    protected $operators = [
        'equal' => '=',
        'not_equal' => '<>',
        'less_than' => '<',
        'greater_than' => '>',
        'less_than_or_equal_to' => '<=',
        'greater_than_or_equal_to' => '>=',
        'in' => 'IN',
        'like' => 'LIKE'
    ];

    public function scopeSearchPaginateAndOrder($query)
    {
        $request = app()->make('request');

        return $query
            ->orderBy($request->column, $request->direction)
            ->where(function($query) use ($request) {
                if($request->has('search_input')) {
                    if($request->search_operator == 'in') {
                        $query->whereIn($request->search_column, explode(',', $request->search_input));
                    } else if($request->search_operator == 'like') {
                        $query->where($request->search_column, 'LIKE', '%'.$request->search_input.'%');
                    }
                    else {
                        $query->where($request->search_column, $this->operators[$request->search_operator], $request->search_input);
                    }
                }
            })
            ->paginate($request->per_page);
    }

}
public function getData()
{
    $models = Company::searchPaginateAndOrder();
    return response()->json([
        'model' => $models
    ]);
}
http://stellar.dev/api/companies?column=name&direction=asc&page=1&per_page=50&search_column=name&search_operator=like&search_input=icici
我在这里面临的问题是,它只能通过一列进行搜索,我希望在一个查询中使用多列进行搜索。建议我可以做什么


谢谢。

您应该将您的查询字符串设置为一个数组,用于像这样的多列

http://stellar.dev/api/companies?column=name&direction=asc&page=1&per_page=50&search_column[]=name&search_operator[]=like&search_input[]=icici&search_column[]=lastname&search_operator[]=like&search_input[]=asd
然后读取它们并将其用作数组。您还需要检查它们的长度,以防止出现意外错误。然后,您可以使用一个简单的循环来连接您的条件,如下面的代码块

trait DataViewer {

    protected $operators = [
        'equal' => '=',
        'not_equal' => '<>',
        'less_than' => '<',
        'greater_than' => '>',
        'less_than_or_equal_to' => '<=',
        'greater_than_or_equal_to' => '>=',
        'in' => 'IN',
        'like' => 'LIKE'
    ];

    public function scopeSearchPaginateAndOrder($query)
    {
        $request = app()->make('request');
        $searchInputs = $request->get('search_input', []);
        $searchOperators = $request->get('search_operator', []);
        $searchColumns = $request->get('search_column', []);

        $query->orderBy($request->column, $request->direction);

        if(count($searchInputs) == count($searchOperators) && count($searchOperators) == count($searchColumns)) {
            $query->where(function($query) use ($searchInputs, $searchOperators, $searchColumns) {
                for($x = 0, $l = count($searchColumns); $x < $l; $x++){
                    if($searchOperators[$x] == 'in') {
                       $query->whereIn($searchColumns[$x], explode(',', $searchInputs[$x]));
                   } else if($searchOperators[$x] == 'like') {
                        $query->where($searchColumns[$x], 'LIKE', "%{$searchInputs[$x]}%");
                   }
                    else {
                       $query->where($searchColumns[$x], $searchColumns, $searchInputs[$x]);
                   }
               }
           });
        }

        return $query->paginate($request->per_page);
    }

}
trait数据查看器{
受保护的$operators=[
“等于”=>“=”,
“不等于”=>“,
'小于'=>'',
“小于或等于”=>“=”,
'在'=>'在'',
'喜欢'=>'喜欢'
];
公共函数作用域SearchPaginateAndOrder($query)
{
$request=app()->make('request');
$searchInputs=$request->get('search_input',[]);
$searchOperators=$request->get('search_operator',[]);
$searchColumns=$request->get('search_column',[]);
$query->orderBy($request->column,$request->direction);
if(count($searchInputs)==count($searchOperators)&&count($searchOperators)==count($searchColumns)){
$query->where(函数($query)use($searchInputs、$searchOperators、$searchColumns){
对于($x=0,$l=count($searchColumns);$x<$l;$x++){
如果($searchOperators[$x]=='in'){
$query->where($searchColumns[$x],explode(',',$searchInputs[$x]);
}else if($searchOperators[$x]=='like'){
$query->where($searchColumns[$x],'LIKE',“%{$searchInputs[$x]}%”);
}
否则{
$query->where($searchColumns[$x],$searchColumns,$searchInputs[$x]);
}
}
});
}
返回$query->paginate($request->per_page);
}
}
注意:我强烈建议在这个搜索页面上使用post动词,否则您的数据将是html编码的,并且您的url绝对不是用户友好的

编辑的答案

我已经更改了多列、单运算符和单字段的代码

public function scopeSearchPaginateAndOrder($query)
    {
        $request = app()->make('request');
        $searchInput = $request->get('search_input');
        $searchOperator = $request->get('search_operator');
        $searchColumns = $request->get('search_column', []);

        $query->orderBy($request->column, $request->direction);

        if(count($searchColumns) > 0) {
            $query->where(function($query) use ($searchInput, $searchOperator, $searchColumns) {
                for($x = 0, $l = count($searchColumns); $x < $l; $x++){
                    if($searchOperator == 'in') {
                        $query->whereIn($searchColumns[$x], explode(',', $searchInput));
                    } else if($searchOperator == 'like') {
                        $query->where($searchColumns[$x], 'LIKE', "%{$searchInput}%");
                    }
                    else {
                        $query->where($searchColumns[$x], $searchOperator, $searchInput);
                    }
                }
            });
        }

        return $query->paginate($request->per_page);
    }
public函数作用域searchpaginateandorder($query)
{
$request=app()->make('request');
$searchInput=$request->get('search_input');
$searchOperator=$request->get('search_operator');
$searchColumns=$request->get('search_column',[]);
$query->orderBy($request->column,$request->direction);
如果(计数($searchColumns)>0){
$query->where(函数($query)use($searchInput、$searchOperator、$searchColumns){
对于($x=0,$l=count($searchColumns);$x<$l;$x++){
如果($searchOperator=='in'){
$query->where($searchColumns[$x],explode(',',$searchInput));
}else if($searchOperator=='like'){
$query->where($searchColumns[$x],'LIKE',“%{$searchInput}%”);
}
否则{
$query->where($searchColumns[$x],$searchOperator,$searchInput);
}
}
});
}
返回$query->paginate($request->per_page);
}

您好,谢谢您的回答,我不想要多输入搜索或多操作员搜索,我只想要多个搜索列。你们是对的,我们必须在post方法中包含所有这些数据。这个答案只包括多个搜索列。只需将等待三个数组更改为等待一个数组(搜索列)。我已经编辑了我的答案,我希望它能起作用。是的。甚至我也做了这些改变。谢谢……)