Laravel красноречиво возвращает неправильные данные

#php #laravel

#php #laravel

Вопрос:

У меня есть условные данные, и они игнорируют эти условия при возврате данных:

Работает нормально

 $orders = Order::where('user_id', $user->id)->with(['customer', 'laundry', 'driver', 'driver.user', 'progresses' => function($p){
  $p->orderby('created_at', 'asc');
}, 'progresses.progress', 'services'])->get();
 

Возвращает неправильные данные

 $orders = Order::where('user_id', $user->id)->with(['customer', 'laundry', 'driver', 'driver.user', 'progresses' => function($p){
                $p->orderby('created_at', 'asc');
            }, 'progresses.progress', 'services'])
            ->where('id', 'like', '%'.$this->search.'%')
            ->orWhere('transport', 'like', '%'.$this->search.'%')
            ->orWhere('amount', 'like', '%'.$this->search.'%')
            ->orWhere('weight', 'like', '%'.$this->search.'%')
            ->orWhere('total', 'like', '%'.$this->search.'%')
            ->paginate(10);
 

Проблема

Второй запрос возвращает все orders и игнорирует where('user_id', '=', $user->id) .

Вопрос

  1. почему он игнорирует where('user_id', '=', $user->id)
  2. Как это исправить?

Комментарии:

1. Как вы думаете, почему он игнорирует where(‘user_id’, ‘=’, $user->id)? Вы проверили SQL-запрос?

2. @Ricardinho TBH, если понятия не имеешь, почему 🙂 а ты? да, пожалуйста, скажите мне.

3. Я предполагаю orWhere() , что это компрометирует начальный where()

Ответ №1:

Вы должны сгруппировать свой поисковый LIKE запрос здесь

 Order::with(
     [
       'customer', 
       'laundry', 
       'driver', 
       'driver.user', 
       'progresses' => function($p) {
          $p->orderby('created_at', 'asc');
       }, 
       'progresses.progress', 
       'services'
     ]
    )->where('user_id', $user->id)
    ->where(function($q) {
        $q->where('id', 'like', '%'.$this->search.'%')
        ->orWhere('transport', 'like', '%'.$this->search.'%')
        ->orWhere('amount', 'like', '%'.$this->search.'%')
        ->orWhere('weight', 'like', '%'.$this->search.'%')
        ->orWhere('total', 'like', '%'.$this->search.'%');
    })->paginate(10);
 

Таким образом, строка запроса выглядит следующим образом:

 WHERE user_id = ? 
AND 
(id LIKE ? OR transport LIKE ? OR amount LIKE ? OR weight LIKE ? OR total LIKE ?)
 

Он будет игнорировать where('user_id', '=', $user->id) из orWhere -за вашего поискового LIKE запроса

Комментарии:

1. Привет, я только что дважды проверил свои where('user_id', '=', $user->id) работы, но данные не представлены. :/

2. что вы имеете в виду, говоря «вы не получили никаких результатов»?

3. извините, я нашел проблему: D