Я хочу найти все записи из базы данных, а затем отфильтровать эти записи, но когда я хочу увидеть запрос с
dd($posts->toSql());
это дает мне ошибку
"IlluminateDatabaseEloquentCollection::toSql does not exist."
это дает мне еще одну ошибку
"Method IlluminateDatabaseEloquentCollection::paginate does not exist."
$posts = Post::all(); if( !is_null($brand) ) $posts = $posts->where('brand', $brand); if( !is_null($car_type) ) $posts = $posts->where('car_type', $car_type); if( !is_null($color) ){ $posts = $posts->where('exterior_color', $color); } $posts = $posts->whereBetween('year',[$from_year,$to_year]); $posts = $posts->whereBetween('milage',[$min_milage,$max_milage]); $posts = $posts->whereBetween('price',[$min_price,$max_price]); $posts = $posts->paginate(4); dd($posts->toSql());
Всего 2 ответа
Во-первых, замените Post::all()
на Post::query()
. Вы получаете все результаты, прежде чем начать фильтрацию.
Метод paginate()
выполнит запрос и загрузит результаты в Collection
, что означает, что вы вызываете toSql()
для коллекции вместо экземпляра построителя запросов.
Поэтому вам следует либо вызвать toSql()
перед вызовом paginate()
, либо, если вы хотите увидеть ограничения нумерации страниц, вы можете сделать следующее, прежде чем запускать запрос / в поставщике услуг.
use IlluminateSupportFacadesDB; // ... DB::listen(function ($query) { var_dump($query->sql); });
Вы не можете ->paginate()
или ->toSql()
после Post::all() / Post::get()
Используйте ниже:
$posts = Post::query(); if( !is_null($brand) ) $posts = $posts->where('brand', $brand); $posts = $posts->whereBetween('year',[$from_year,$to_year]); $posts = $posts->whereBetween('milage',[$min_milage,$max_milage]); $posts = $posts->whereBetween('price',[$min_price,$max_price]); // $posts = $posts->paginate(4); dd($posts->toSql());