将where子句作为参数传递给另一个函数laravel

时间:2019-06-13 10:42:53

标签: php laravel

我有一个方法可以处理数据表中的查询。

现在函数看起来像这样

   $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;
}   

有人可以帮助我解决这个问题

2 个答案:

答案 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;
}