Я хочу выполнить замену в запросе к базе данных с помощью ЗАМЕНЯТЬ(). В phpMyAdmin нет проблем с его использованием в необработанном запросе, но Laravel выдает ошибку:
Запрос:
$p = Products::select('*, REPLACE(abstract, \'[[name]]\', name) AS abstract')
->Paginate(10);
Ошибка:
QLSTATE[42S22]: Column not found: 1054 Unknown column '*,
REPLACE(abstract, '[[name]]', name)' in 'field list' (SQL: select `*,
REPLACE(abstract, '[[name]]', name)` as `abstract` from
`products` limit 3 offset 0)
Ева, если я попробую с таким массивом, возникнет ошибка.
Products::select([ 'name', 'REPLACE(abstract, \'[[name]]\', name) AS abstract' ])
->Paginate(10)
Почему здесь нельзя использовать REPLACE ()?
Да, вы не можете использовать необработанный SQL в таком выборе. Однако существует также возможность использовать DB :: raw ('select *, REPLACE (abstract, \' [[name]] \ ', name) AS abstract »); Я не уверен, работает ли paginate с результатом, может быть, вы можете протестировать и сообщить мне? ;)
@Uueerdo: Нет, это срабатывает: 'SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец' REPLACE (abstract, '[[name]]', name) 'в' списке полей '(SQL: select *, REPLACE(abstract, '[[name]]', name)'
@RobBiermann Ваше решение не вызывает исключения, но даже не заменяет иглу, как expectet. Просто ничего не заменяет ... :-)






Следует использовать selectRaw, иначе конструктор запросов laravel экранирует всю строку как поле.
$p = Products::selectRaw('products.*, REPLACE(abstract, \'[[name]]\', name) AS abstract')->Paginate(10);
Просто наплевать, я никогда не использовал laravel, но вы пробовали
$p = Products::select('*', 'REPLACE(abstract, \'[[name]]\', name) AS abstract') ->Paginate(10);? Документы, кажется, предполагают, чтоselectпринимает список выражений полей; в вашей первой попытке похоже, что он обрабатывает*, ...как одно поле; а ваш второй передает один массив (?), а не отдельные аргументы для каждого.