Красноречивый whereRaw не работает с привязками - PullRequest
1 голос
/ 10 октября 2019

В моей базе данных есть столбец json с французскими символами. Поэтому, когда я использую:

App\Job::where('name->fr', 'like', '%Fune%')->count();

Не удается найти результаты для заданий с акцентом в имени, например Funéraire. Я могу добиться того, чего хочу, добавив в запрос сопоставление, используя whereRaw:

App\Job::whereRaw('json_unquote(json_extract(`name`, \'$."fr"\')) LIKE \'%Fune%\' collate utf8mb4_general_ci')->count();

Однако, когда я использую привязки в моем методе whereRaw:

App\Job::whereRaw('json_unquote(json_extract(`name`, \'$."fr"\')) LIKE ? collate utf8mb4_general_ci', ['%Fune%'])->count();

Я получаю сообщение об ошибке базы данных:

COLLATION 'utf8mb4_general_ci' недопустим для CHARACTER SET 'binary' (SQL: выберите количество (*) из jobs, где json_unquote (json_extract (name,'$. "fr"')) LIKE% Fune% collate utf8mb4_general_ci)

Просто интересно, почему это не работает, когда я передаю его с привязками.

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Необходимо преобразовать привязку в UTF-8:

App\Job::whereRaw(
    'json_unquote(json_extract(name, \'$."fr"\')) LIKE convert(? using utf8mb4)', 
    ['%Fune%']
)
0 голосов
/ 11 октября 2019

Подбородок.

если у вас есть столбец JSON в БД, вы можете напрямую запустить запрос на столбец схожего типа, так как JSON является строкой и, как% text%, ищет текст в строке.

Вам не нужно проходить через эту большую проблему, чтобы найти похожее имя.

Ваш запрос может выглядеть примерно так:

App\Job::where('name_of_column_of_json', 'like', '%Fune%')->count();

, и вы получите желаемый результат,

ударил его и дайте нам знать, работает или нет.

...