我有一个方法可以处理数据表中的查询。
现在函数看起来像这样
$rowsPerPage = $request->get('rowsPerPage') ? $request->get('rowsPerPage') : 10;
$sortBy = $request->get('sortBy');
$desc = $request->get('descending');
$query = $request->get('query');
$modelData = Airline::where('id', '>', 0);
if ($query) {
$modelData = $modelData->where(function ($q) use ($query) {
$q->where('airline_name', 'LIKE', '%' . $query . '%')
->where('iata_code', 'LIKE', '%' . $query . '%');
})->orWhereHas('country', function ($q) use ($query){
$q->where('country_name', 'LIKE', '%' . $query . '%');
});
}
if ($sortBy == 'null') {
$sortBy = 'created_at';
$desc = false;
}
if ($desc) {
$modelData->orderBy($sortBy, 'DESC');
} else {
$modelData->orderBy($sortBy, 'ASC');
}
$rowsPerPage = $rowsPerPage==-1 ? $modelData->count() : $rowsPerPage;
$modelData = $modelData->paginate($rowsPerPage);
return $modelData;
这工作正常,但是我在另一个控制器方法中再次废除了相同的代码。在控制器之间唯一改变的是whereClause方法。除了这部分,我想将此方法中的所有代码放到另一个函数中。
$modelData->where(function ($q) use ($query) {
$q->where('airline_name', 'LIKE', '%' . $query . '%')
->where('iata_code', 'LIKE', '%' . $query . '%');
})->orWhereHas('country', function ($q) use ($query){
$q->where('country_name', 'LIKE', '%' . $query . '%');
});
我想将此where子句作为参数传递给新函数。对于例如
public static function IndexQuery($model,$whereClause){
$rowsPerPage = request('rowsPerPage')? request('rowsPerPage') : 10;
$sortBy = request('sortBy');
$desc = request('descending');
//Where clause pass should execute here with model object .
if ($sortBy == 'null') {
$sortBy = 'created_at';
$desc = false;
}
if ($desc) {
$model->orderBy($sortBy, 'DESC');
} else {
$model->orderBy($sortBy, 'ASC');
}
$rowsPerPage = $rowsPerPage==-1 ? $model->count() : $rowsPerPage;
$data = $model->paginate($rowsPerPage);
return $data;
}
有人可以帮助我解决这个问题
答案 0 :(得分:2)
您可以为此使用 Laravel模型范围。尝试使用模型本地范围,例如:
//在您内部模拟Airline.php
public function scopeFilterWithQuery($queryBuilder, $query)
{
if($query) {
$queryBuilder = $queryBuilder->where(function ($q) use ($query) {
$q->where('airline_name', 'LIKE', '%' . $query . '%')
->where('iata_code', 'LIKE', '%' . $query . '%');
})->orWhereHas('country', function ($q) use ($query){
$q->where('country_name', 'LIKE', '%' . $query . '%');
});
}
return $queryBuilder;
}
//现在在控制器中
$modelData = Airline::where('id', '>', 0)->filterWithQuery($query);
// your other codes.
您可以在模型范围内包装尽可能多的常见条件,然后重复使用。
答案 1 :(得分:1)
尝试一下...
public function WhereClause($q,$query)
{
$qdata= $modelData->where(function ($q) use ($query) {
$q->where('airline_name', 'LIKE', '%' . $query . '%')
->where('iata_code', 'LIKE', '%' . $query . '%');
})->orWhereHas('country', function ($q) use ($query){
$q->where('country_name', 'LIKE', '%' . $query . '%');
});
return $qdata;
}
//控制器
$qresult=$this->WhereClause($data1, $data2);
public static function IndexQuery($model,$qresult){
$rowsPerPage = request('rowsPerPage')? request('rowsPerPage') : 10;
$sortBy = request('sortBy');
$desc = request('descending');
//Where clause pass should execute here with model object .
if ($sortBy == 'null') {
$sortBy = 'created_at';
$desc = false;
}
if ($desc) {
$model->orderBy($sortBy, 'DESC');
} else {
$model->orderBy($sortBy, 'ASC');
}
$rowsPerPage = $rowsPerPage==-1 ? $model->count() : $rowsPerPage;
$data = $model->paginate($rowsPerPage);
return $data;
}