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方法中包含所有这些数据。这个答案只包括多个搜索列。只需将等待三个数组更改为等待一个数组(搜索列)。我已经编辑了我的答案,我希望它能起作用。是的。甚至我也做了这些改变。谢谢……)