#laravel #eloquent #laravel-query-builder
#laravel #eloquent #laravel-query-builder
Вопрос:
Я создаю «простой» API для laravel. Этот API должен обрабатывать фильтры, разбивку на страницы и сортировку результата. Для этого я использую laravel Query Builder. Проблема в том, что он выполняет выбор без имени таблицы, например:
select * order by `id` asc
Мой код:
public function index()
{
$request = request();
$query = DB::table('customers')->newQuery();
// Orden
if (request()->has('sort')) {
// Multiorden
$sorts = explode(',', request()->sort);
foreach ($sorts as $sort) {
list($sortCol, $sortDir) = explode('|', $sort);
$query = $query->orderBy($sortCol, $sortDir);
}
} else {
$query = $query->orderBy('id', 'asc');
}
//Filtros
if ($request->exists('filter')) {
$query->where(function($q) use($request) {
$value = "%{$request->filter}%";
$q->where('name', 'like', $value)
->orWhere('address', 'like', $value);
});
}
$perPage = request()->has('per_page') ? (int) request()->per_page : null;
$pagination = $query->get()->paginate($perPage);
$pagination->appends([
'sort' => request()->sort,
'filter' => request()->filter,
'per_page' => request()->per_page
]);
return response()->json(
$pagination
);
}
Ошибка:
Исключение Illuminate Database QueryException: SQLSTATE[HY000]: Общая ошибка: 1096 В файле не используются таблицы (SQL: выберите * упорядочить по
id
asc) C:xampphtdocsiServicevendorlaravelframeworksrcIlluminateDatabaseConnection.php в строке 664
Обновить:
return DB::table('customers')->get();
Если я использую это, API работает нормально, у меня работают другие API. Проблема в том, что мне нужен конструктор запросов для обработки фильтров, сортировки и т.д…
Комментарии:
1. верны ли ваши учетные данные базы данных? могу ли я увидеть скриншот этого?
2. судя по вашему сообщению об ошибке, похоже, что вашему построителю запросов не удалось найти таблицу «клиенты», поэтому вы не можете найти столбец «id»: (SQL: select * order by id asc) в файле
3. @Noctis17 мне кажется, что я совершаю ошибку в построителе запросов, потому что с помощью -> get () вместо -> newQuery() я получаю все данные обратно. Если у меня ошибка разрешений, другая функция не будет работать.
Ответ №1:
Проблема заключалась в том, как я создавал экземпляр нового запроса.
$query = DB::table('customers')->newQuery();
Исправить:
$query = Model::query();
Для моего примера:
$query = Customer::query();