Я пытаюсь получить запись из таблицы 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 результат.
[SQL Server]Недопустимое имя столбца «обновленное_значение[0]». (SQL: выберите верхнюю часть 1 * из [contact_change_logs], где json_value([updated_value[0]]], '$.phone_number'') = 5555555555, упорядочите по [create_at] desc) - Получение этой ошибки @MAHAOUEGHLANI
@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'") Я знаю это не верно
@Гиту, я думаю, это что-то вроде этого: ->whereRaw("EXISTS (SELECT 1 FROM OPENJSON(updated_value) j1 CROSS APPLY OPENJSON(j1.[value]) j2 WHERE JSON_VALUE(j2.[value], '$.phone_number') = ?)", ['5555555555']).
@Zhorov Спасибо, это сработало. Можете ли вы добавить это как новый комментарий? так что я могу принять это как ответ






Вместо whereJsonContains() можно использовать where().
$existing = ContactChangeLogs::latest()
->whereJsonContains('updated_value->phone_number', '5555555555')
->first();
тот же нулевой результат @Mit Kathrotia
Возможный подход — использовать метод 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.
Ой, извините, я просто забыл, что вы используете MSSQL, проверьте обновленный запрос сейчас.
@Amit Mohanty Нет результатов
@AmitMohanty, вам нужен другой путь ('$[0][0].phone_number') для анализа этого содержимого JSON.
@AmitMohanty Да, это тоже работает. Пожалуйста, обновите свой основной комментарий. Так что я могу проголосовать за.
updated_value— это массив массивов, поэтому попробуйте сделатьupdated_value[0]->phone_number