У меня есть таблица, которая выглядит так:
[
{
"id": 35,
"json_col": [
{
"key_one": 4,
"key_two": {
"value": 1,
"type": "static"
}
},
{
"key_one": 27,
"key_two": {
"value": 26,
"type": "dynamic"
}
}
],
"created_at": "2023-02-13T16:54:13.000000Z",
"updated_at": "2023-02-13T16:54:13.000000Z"
},
{
"id": 36,
"json_col": [
{
"key_one": 2,
"key_two": {
"value": 33,
"type": "static"
}
},
{
"key_one": 9,
"key_two": {
"value": 1,
"type": "any"
}
}
],
"created_at": "2023-02-13T16:54:56.000000Z",
"updated_at": "2023-02-13T16:54:56.000000Z"
}
]
Как получить строку 35
, в которой есть key_two
с value
= 1
и type
= static
, используя построитель запросов или необработанный запрос?
@geertjanknapen У меня есть опыт использования этого построителя и необработанных SQL-запросов, я просто сталкиваюсь с трудностями с массивом объектов.
вы можете использовать whereJsonContains с многомерным массивом в зависимости от того, как вы их храните.
return Model::whereJsonContains('json_col', [ ['key_two' => [ 'value' => 1] ] ])
->whereJsonContains('json_col', [ ['key_two' => [ 'type' => 'static'] ] ])
->paginate(10); // or get()
просто дважды проверьте, что вывод sql на самом деле выглядит как ваш формат json, который должен выглядеть примерно так
WHERE json_contains(`json_col`, '[{\"key_two\":{\"value\":1}}]')
AND json_contains(`json_col`, '[{\"key_two\":{\"type\":\"static\"}}]')
РЕДАКТИРОВАТЬ
Если вам нужно искать несколько совпадений в одном объекте, это должно делать
return Model::whereJsonContains('json_col', [ ['key_two' => [ 'value' => 1, 'type' => 'static' ] ] ])
->paginate(10); // or get()
Хороший ответ, но извините, моему вопросу не хватило точности (я его отредактировал). Мне нужно value=1 AND type='static'
на том же key_two
объекте.
Я отредактировал свой ответ, но опять же, просто создайте их так, как они выглядят в php-массиве.
Я даже умею whereJsonContains('json_col', [['key_two' => ['type'=>'static'], 'key_one'=>4])
. спасибо за четкий ответ
вам не хватает квадратной скобки ]
перед 4
в вашем примере, но да, легко выполнить запрос с объектом json в laravel, хотя это зависит от того, как вы их храните и извлекаете, и иногда выполнение поиска %LIKE%
может быть кошмаром
Взгляните на предложения JSON where в документации здесь