Laravel:使用Elouquent的动态where子句

时间:2015-06-19 16:04:00

标签: laravel eloquent

我用搜索参数调用URL是动态的。我怎样才能形成正确的雄辩的查询

理论上:

  1. 查询
  2. 查询where(someParam1)
  3. 查询where(someParam2)
  4. 查询orderby(someParam3)
  5. query get
  6. 我需要这种结构,所以如果 param存在,我可以使用where子句。 如果Laravel有其他方式,请告诉我。

6 个答案:

答案 0 :(得分:61)

Laravel很容易。做这样的事情:

$query = User::query();

if ($this == $that) {
  $query = $query->where('this', 'that');
}

if ($this == $another_thing) {
  $query = $query->where('this', 'another_thing');
}

if ($this == $yet_another_thing) {
  $query = $query->orderBy('this');
}

$results = $query->get();

答案 1 :(得分:1)

You can use like this

$validateUserDetail = User::query();
if (!empty($userDetails['email'])) {
    $validateUserDetail->whereemail($userDetails['email']);
}if (!empty($userDetails['cellphone'])) {
    $validateUserDetail->wherecellphone($userDetails['cellphone']);
}
$validateUserDetail->select('username');
$validateUserDetail->get()

答案 2 :(得分:1)

您可以只使用where语句。 例如:在users表或User模型上,您需要动态搜索名称id。你可以做到

$where = [];
$firstName = $request->get('first_name');
if ($firstName) $where[] = ['first_name', 'like'. '%' . $firstName . '%'];
$id = $request->get('id');
if ($id) $where[] = ['id', $id];
$users = User::where($where)->get();

默认情况下,它将返回所有用户,如果$where数组中存在任何内容,它将在其上应用where condition

答案 3 :(得分:0)

您可以通过以下示例传递动态值

$user_auctions = $this->with('userAuctions')
                ->where('users.id', '=', $id)
                ->get();

答案 4 :(得分:0)

我是从谷歌来的。如果你要迭代5个以上if语句,那么使用switch语句会更有效

 if(empty($request->except('_token')))
        return 'false';

    $models = Vehicle::query();
    $request_query = $request->all();
    $year_switch = false;

    foreach ($request_query as $key => $field_value){



        if($field_value != 'any'){                
            switch($field_value){
                case 'X':                                            
                case 'Y':
                    $year_switch = true; 
                break;
                case'Z':
                    //Dynamic
                    $models->where($key,'LIKE', $field_value);
                break;

            }                    
        }
    }

答案 5 :(得分:0)

您可以将回调传递给where函数。

因此,您可以执行以下操作:

class TestService {

   TestRepository $testeRepository;

   public function __construct(TesteRepository $teste) {
      $this->testeRepository = $teste;
   }

   public function getAll(array $filters)
   {
      $where = function (Builder $query) use ($filters) {
         collect($filters)
            ->each(function ($value, $param) use ($query) {
               if ($param === 'test') {
                  $query->where($param, '=', $value); 
               } else if ($param === 'test2') {
                  $query->orWhere($param, '>', $value);
               }
            });
      };
      return $this->testRepository->gelAll($where);
   }

class TestRepository
{
   public function getAll(\Closure $where)
   {
        $query = TestModel::query();
        $query->where($where);
        //and put more stuff here, like:
        //$query->limit(15)->offset(30)
        ...
       return $query->get();
   }
}

然后在您的控制器中通过过滤器:

class TestControler ...
{
    public function $index()
    {
       $filters = request()->query();
       return $this->testService->getAll($filters);
    }
}