Подзапрос в Laravel Eloquent

#php #mysql #laravel #eloquent #subquery

#php #mysql #laravel #красноречивый #подзапрос

Вопрос:

Я нашел несколько похожих тем, поэтому прошу прощения, если это своего рода репост, но я пытаюсь написать этот запрос в Eloquent, используя Laravel, чтобы я мог разбивать страницы, но, честно говоря, это сбивает меня с толку .. Кто-нибудь может помочь?

Вот запрос:

 $results = DB::select(
    'SELECT * FROM tickets WHERE id IN '.
    '(SELECT ticket_id FROM working_on WHERE user_id ='.Auth::user()->id.
    ' AND NOT state=0 AND NOT state=2)'
) -> orderBy("id", "desc") -> paginate(3);
  

Который возвращает ошибку: «Вызов функции-члена OrderBy() для массива», поскольку он не написан в стиле Eloquent.

Спасибо

Ответ №1:

Вы используете select неправильно. select Метод принимает имена столбцов в качестве параметров. Также было бы лучше, если бы вы не использовали необработанные выражения, потому что, делая это, вы теряете экранирование Laravel. Вместо этого вам следует использовать конструктор запросов Laravel.

Это должно выглядеть примерно так:

 DB::table('tickets')
  ->select('*')
  ->whereIn('id', function($query) {
    $query->select('ticket_id')
      ->from('working_on')
      ->where('user_id', Auth::user()->id)
      ->whereNotIn('state', [0, 2]);
  })->orderByDesc('id')
  ->paginate(3);
  

Кстати, первый select является избыточным, поскольку * является значением по умолчанию.

Кроме того, рассмотрите Ticket возможность прямого запроса модели вместо таблицы базы данных или создания WorkingOn модели и ее использования.

Ответ №2:

попробуйте это

 $results = Ticket::where('user_id', Auth::user()->id)->where('state','!=',0)->where('state','!=',2)->orderBy("id", "desc")->paginate(3);