Прежде всего, большое спасибо за то, что читаете меня и помогаете мне в этом, так как я новичок в laravel.
Я сделал развертывание веб-сайта, предоставленного мне компанией, и все работает, кроме поиска в таблице post_categories в базе данных.
Когда я ввожу ссылку, которая выполняет запрос к базе данных, чтобы получить все сообщения этой категории, я получаю следующую ошибку (в данном случае для категории 13):
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '>'$. "en"' asc' at line 1 (SQL: select * from `post_categories` where `post_categories`.`parent_id` = 13 and `post_categories`.`parent_id` is not null order by `title`->'$. "en"' asc)
Однако, если я перехожу непосредственно к любому сообщению в этой категории, его прекрасно видно, поэтому это влияет только на поисковую систему.
Ошибка вызвана тем, что title->'$. Часть "es" не работает, но я не знаю почему, поскольку запрос генерируется прямо отсюда, насколько я могу судить по коду.
public function select($query, $bindings = [], $useReadPdo = true)
{
return $this->run($query, $bindings, function ($query, $bindings) use ($useReadPdo) {
if ($this->pretending()) {
return [];
}
// For select statements, we'll simply execute the query and return an array
// of the database result set. Each element in the array will be a single
// row from the database table, and will either be an array or objects.
$statement = $this->prepared($this->getPdoForSelect($useReadPdo)
->prepare($query));
$this->bindValues($statement, $this->prepareBindings($bindings));
$statement->execute();
return $statement->fetchAll();
});
}
Я подумал, что, возможно, это какая-то переменная php, которая не определена должным образом, но я не трогал ни один код, так как я только развернул, а сеть на сервере компании правильно выполняет поиск.
Кто-нибудь знает, как помочь мне решить эту ошибку?
Спасибо вам всем!
все данные и доказательства были предоставлены выше
Обновлено: Благодаря ceejayoz я обнаружил, что проблема в том, что MariaDB не поддерживает вызов:
select * from `post_categories` order by `title`->'$. "en"' asc
Это должно быть следующим образом:
select * from `post_categories` order by JSON_EXTRACT(`title`, '$. "en"') asc;
Кто-нибудь знает, как заставить Laravel заменить все вызовы на новый формат?
СПАСИБО!
Хорошо, по вашей ссылке я увидел, что это способ получить часть Json, действительно, в этой части у нас есть json. Но, похоже, моей MariaDB это не нравится, что мне делать?
Что вы используете для своей функции перевода? Пакет? Что-то рукотворное?
Привет @ceejayoz Насколько мне известно, я не использую никакую систему перевода. Проблема возникает с другой стороны, что благодаря вашему комментарию мне удалось выяснить. Я отредактировал основной пост.






Кажется, вы определили проблему и решение, которое включает использование JSON_EXTRACT в ваших SQL-запросах вместо -> нотации для полей JSON в вашем предложении order by. Чтобы применить это изменение ко всем запросам, автоматически сгенерированным Laravel, вы можете использовать функциональность макросов построителя запросов.
В вашем приложении Laravel вы можете создать макрос в поставщике услуг, таком как AppServiceProvider. Вот как вы можете определить макрос для замены нотации -> на JSON_EXTRACT.
use Illuminate\Database\Query\Builder;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Builder::macro('orderByJsonField', function ($field, $jsonKey, $direction = 'asc') {
return $this->orderByRaw("JSON_EXTRACT($field, '$. \"$jsonKey\"') $direction");
});
}
}
В приведенном выше коде мы определили макрос с именем orderByJsonField. Затем вы можете использовать этот макрос в любом экземпляре построителя запросов для упорядочения по подразделу поля JSON:
// Usage example
$categories = DB::table('post_categories')
->where('parent_id', 13)
->orderByJsonField('title', 'en', 'asc')
->get();
С помощью этого макроса вы можете автоматически применять правильный формат для упорядочения полей JSON с определенными подразделами во всем приложении, устраняя необходимость вручную изменять каждый запрос.
Не забудьте добавить этот макрос в метод загрузки поставщика услуг и убедитесь, что поставщик услуг зарегистрирован в вашем файле config/app.php. Это обеспечит доступность макроса во всем приложении.
order by title->'$. "en"'похоже, что это запрос, связанный с переводом. Это не совсем похоже на примеры на dev.mysql.com/doc/refman/8.0/en/…. Используете ли вы какой-то пакет для переводимых моделей?