Laravel 多條件查詢時粗心導致的一個 BUG

Flyertutor發表於2019-05-30

在用 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);

這是在開發中由自己的粗心造成的,在此記錄下。

相關文章