Ошибка "Упс, похоже, что-то пошло не так". на странице Laravel

Прежде всего, большое спасибо за то, что читаете меня и помогаете мне в этом, так как я новичок в 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 заменить все вызовы на новый формат?

СПАСИБО!

order by title->'$. "en"' похоже, что это запрос, связанный с переводом. Это не совсем похоже на примеры на dev.mysql.com/doc/refman/8.0/en/…. Используете ли вы какой-то пакет для переводимых моделей?
ceejayoz 09.08.2023 18:06

Хорошо, по вашей ссылке я увидел, что это способ получить часть Json, действительно, в этой части у нас есть json. Но, похоже, моей MariaDB это не нравится, что мне делать?

javier Rizos marcos segura 09.08.2023 18:20

Что вы используете для своей функции перевода? Пакет? Что-то рукотворное?

ceejayoz 09.08.2023 18:21

Привет @ceejayoz Насколько мне известно, я не использую никакую систему перевода. Проблема возникает с другой стороны, что благодаря вашему комментарию мне удалось выяснить. Я отредактировал основной пост.

javier Rizos marcos segura 09.08.2023 18:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, вы определили проблему и решение, которое включает использование 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. Это обеспечит доступность макроса во всем приложении.

Другие вопросы по теме