在用 Laravel
實現多條件查詢時,經常會用到 if
where
的方法,我們常用的方法有下面兩種:
第一種方法:
$model = new User();
if ($request->has('name')) {
$model->where('name', 'like', '%'. $request->get('name') .'%');
}
$data = $model->orderBy('id', 'desc')->offset(0)->limit(10)->get();
dd($data);
第二種方法:
$model = User::orderBy('id', 'desc');
if ($request->has('name')) {
$model->where('name', 'like', '%'. $request->get('name') .'%');
}
$data = $model->offset(0)->limit(10)->get();
dd($data);
看似上面的程式碼沒什麼問題,如果你執行的話,就會發現方法一得不到你想要的結果,出現了意料之外的情況。
經過認真分析就可以得到 where
條件不起作用,那麼到底是什麼原因造成的呢?我們排查一下:
$model = new User(); // 它的返回值是 User 例項
$model = User::orderBy('id', 'desc'); // 它的返回值是 Builder 例項
從上面的分析就可以看出問題了,那麼我們只要讓第一種方法的返回值為 Builder
例項就可以了。
將第一種方法改寫:
$model = (new User())->orderBy('id', 'desc'); // 這種寫法的返回值是 Builder 例項
if ($request->has('name')) {
$model->where('name', 'like', '%'. $request->get('name') .'%');
}
$data = $model->offset(0)->limit(10)->get();
dd($data);
這是在開發中由自己的粗心造成的,在此記錄下。