Я работал с красноречивым Laravel 5.4, и я столкнулся с проблемой.
У меня есть таблица базы данных, называемая сообщениями, и в этом столбце с именем template_ids
. Он сохраняет значения в формате json_encoded
, например:
["1","25","48"]
Теперь я хочу применить фильтр к моему запросу на основе массива идентификаторов:
$id_access = array:3 [ 0 => "1" 1 => "3" 2 => "48" ]
Я пытаюсь выполнить поиск, если какой-либо из значений $id_access
присутствует в столбце базы данных, template_ids
.
Я пытался:
Post::where('accessable_to',1)->whereIn('template_ids', $template_access_array)->paginate(3);
Кроме того, я попробовал:
Post::where('accessable_to',1)->whereRaw("JSON_CONTAINS(template_ids, ".$template_access.")")->paginate(3);
Я уже видел это , но он не работает для меня.
Чтобы узнать, содержит ли поле template_ids
JSON «любое» значение в массиве игл, вам понадобится использовать несколько условий JSON_CONTAINS
которые требуют MySQL 5.7:
$ids = ['1', '3', '48']; Post::where('accessable_to', 1) ->where(function ($query) use ($ids) { $firstId = array_shift($ids); $query->whereRaw( 'JSON_CONTAINS(template_ids, \'["' . $firstId . '"]\')' ); foreach ($ids as $id) { $query->orWhereRaw( 'JSON_CONTAINS(template_ids, \'["' . $id . '"]\')' ); } return $query; }); return Post::paginate(3);
В построителе запросов Laravel будет создан запрос типа:
SELECT * FROM "posts" WHERE "accessable_to" = ? AND ( JSON_CONTAINS(template_ids, '["1"]') OR JSON_CONTAINS(template_ids, '["3"]') OR JSON_CONTAINS(template_ids, '["48"]') )
Какие записи целей содержат какие-либо из этих идентификаторов в своем поле ввода template_ids
JSON template_ids
.
Возможно, вам будет интересно ознакомиться с соответствующим предложением внутренних дел Laravel.
Что сказать:
$query = Post::where([]); $query->where(function($query, $template_ids){ foreach ($template_ids as $id){ $query->orWhere('searching_field', 'like', '%'.$id.'%'); } }); $query->get()