Проблема с запросом значения json в проекте laravel

Я пытаюсь получить запись из таблицы MSSQL на основе значения поля, содержащего данные JSON. Ниже приведен пример значения столбца «updated_value»:

[[{"phone_number":"5555555555","phone_type":"H","inactive_date":null,"restrictions":["SU","F"],"start_time":null,"end_time":null}]]

Мой запрос:

$existing = ContactChangeLogs::latest()
        ->where('updated_value->phone_number', '5555555555')
        ->first();

Но dd($existing) дает null результат.

updated_value — это массив массивов, поэтому попробуйте сделать updated_value[0]->phone_number

MAHA OUEGHLANI 15.09.2023 13:33

[SQL Server]Недопустимое имя столбца «обновленное_значение[0]». (SQL: выберите верхнюю часть 1 * из [contact_change_logs], где json_value([updated_value[0]]], '$.phone_number'') = 5555555555, упорядочите по [create_at] desc) - Получение этой ошибки @MAHAOUEGHLANI

Geethu 15.09.2023 13:40

@Zhorov Можете ли вы помочь мне написать указанный необработанный запрос к моему коду? ->whereRaw("WHERE EXISTS (SELECT 1 FROM OPENJSON(updated_value) j1 CROSS APPLY OPENJSON(j1.[value]) j2 WHERE JSON_VALUE(j2.[value], '$.phone_number') = '5555555555'") Я знаю это не верно

Geethu 15.09.2023 14:07

@Гиту, я думаю, это что-то вроде этого: ->whereRaw("EXISTS (SELECT 1 FROM OPENJSON(updated_value) j1 CROSS APPLY OPENJSON(j1.[value]) j2 WHERE JSON_VALUE(j2.[value], '$.phone_number') = ?)", ['5555555555']).

Zhorov 15.09.2023 14:09

@Zhorov Спасибо, это сработало. Можете ли вы добавить это как новый комментарий? так что я могу принять это как ответ

Geethu 15.09.2023 14:15
Стоит ли изучать 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 и хотите разрабатывать...
0
5
68
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вместо whereJsonContains() можно использовать where().

$existing = ContactChangeLogs::latest()
        ->whereJsonContains('updated_value->phone_number', '5555555555')
        ->first();

тот же нулевой результат @Mit Kathrotia

Geethu 15.09.2023 13:47
Ответ принят как подходящий

Возможный подход — использовать метод whereRaw() для создания необработанного предложения WHERE для вашего запроса. Фактический оператор зависит от структуры JSON, и в вашем случае вам понадобятся два вызова OPENJSON() для анализа вложенного содержимого JSON:

->whereRaw(
   "EXISTS (
      SELECT 1 
      FROM OPENJSON(updated_value) j1 
      CROSS APPLY OPENJSON(j1.[value]) j2 
      WHERE JSON_VALUE(j2.[value], '$.phone_number') = ?
    )",
    ['5555555555']
)

Дополнительное примечание: если содержимое JSON имеет фиксированную структуру (два вложенных массива, первый из которых содержит один массив JSON, а второй — с одним объектом JSON в качестве элемента), вы можете упростить оператор:

->whereRaw(
   "JSON_VALUE(updated_value, '$[0][0].phone_number') = ?",
    ['5555555555']
)

Вы можете использовать функцию JSON_VALUE для извлечения значения «phone_number» из данных JSON.

$existing = DB::select(
    "SELECT TOP 1 * 
       FROM contact_change_logs 
      WHERE JSON_VALUE(updated_value, '$[0].phone_number') = '5555555555'"
);
LIMIT не является допустимым ключевым словом SQL Server.
Zhorov 15.09.2023 14:19

Ой, извините, я просто забыл, что вы используете MSSQL, проверьте обновленный запрос сейчас.

Amit Mohanty 15.09.2023 14:22

@Amit Mohanty Нет результатов

Geethu 15.09.2023 14:25

@AmitMohanty, вам нужен другой путь ('$[0][0].phone_number') для анализа этого содержимого JSON.

Zhorov 15.09.2023 14:34

@AmitMohanty Да, это тоже работает. Пожалуйста, обновите свой основной комментарий. Так что я могу проголосовать за.

Geethu 18.09.2023 06:47

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