Как получить значение json в laravel 5.7?

У меня есть две таблицы в базе данных, package и categories.

package имеет поле category_id, которое содержит данные в этой форме ["1","11"] и показывает categories данные в виде флажка.

Теперь мне нужны все данные из package, где category_id равно categories id.

Вот мой код:

public function archive_packages(Request $request, $slug){
    $title='Archive Packages';
    $para='';
    $slugs='archive-packages';
    $categoryRow = Category::where('slug',$slug)->first();
    $categoryID = $categoryRow->id;
    $package = Packages::whereRaw('JSON_CONTAINS(category_id, \'["11"]\')')->get();
    dd($package);
    return view('pages.archive-packages',compact('title','para','slugs','package'));
}

Я получаю следующую ошибку:

SQLSTATE[42000]: синтаксическая ошибка или нарушение прав доступа: 1305 FUNCTION
pre.JSON_CONTAINS не существует (SQL: выберите * из `пакетов`, где
JSON_CONTAINS(category_id, '["11"]'))


person Areeba    schedule 06.05.2019    source источник
comment
обновите свой mysql   -  person Chay22    schedule 06.05.2019


Ответы (3)


Для этого есть метод laravel, подробнее здесь

Поэтому, пожалуйста, попробуйте:

Packages::whereJsonContains('category_id', '11')->get();

Если ваша версия mysql не поддерживает json_contains и вы не можете ее обновить, попробуйте этот запрос:

Packages::where('category_id', 'like', '%"11"%');
person nakov    schedule 06.05.2019
comment
У меня есть массив идентификаторов, хранящихся в формате json, я попробовал это сам, и это сработало. Не забудьте кавычки, потому что без них это не работает, поэтому 11 не будет работать, а '11' будет. В противном случае скажите мне, что вы получаете, и я могу попытаться помочь. - person nakov; 06.05.2019
comment
(2/2) QueryException SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1305 FUNCTION pre.json_contains не существует (SQL: выберите * из packages, где json_contains (category_id, 11)) - person Areeba; 07.05.2019
comment
Пожалуйста, проверьте, существует ли версия mysql, которую вы используете для функции json_contains. Или попробуйте мой отредактированный код. - person nakov; 07.05.2019
comment
любезно помогите больше, если мы заменим 11 на переменную, такую ​​как $categoryID, которая содержит числа, такие как 11, 1, 5 и т. д. - person Areeba; 07.05.2019
comment
Я предлагаю вам обновить версию mysql, потому что like будет возвращать результаты, даже если один из category ids существует в массиве. Я не знаю, было ли это твоим намерением. И чтобы передать переменную, замените '%"11"%' на '%"'. $categoryID .'"%'. - person nakov; 07.05.2019

PHP имеет встроенный метод json_encode() для простого кодирования массивов в строковый формат JSON. Мы можем реализовать это как: это мы также можем использовать в laravel

$массив = массив('ноутбук','наушники','мышь'); вернуть json_encode ($ массив);

Однако более новые версии Laravel также имеют собственный метод json(), который автоматически устанавливает соответствующий Content-Type и кодирует данные JSON:

$массив = массив('ноутбук','наушники','мышь'); вернуть ответ () -> json ($ массив);

person Afzal Patel    schedule 06.05.2019
comment
Ваш ответ совершенно не связан с вопросом. - person nakov; 06.05.2019
comment
Да, я не следую описанию, на краткий вопрос дал ответ, спасибо - person Afzal Patel; 06.05.2019

Пример JSON:

[ { "id": 11, "first_name": "Энтони", "last_name": "Росс", "language": "english", "grade": 1 } ]

Если у вас есть несколько значений в json, вы можете попробовать цикл, например,

foreach($target as $target_result){
  echo $target_result->id;
}

Если у вас есть только одна запись, попробуйте,

$target = Var::where('first_name', '=', $request->input('jsonArr'))->first();
return $jsonArr->id
person Sanjiv Dutta    schedule 07.05.2019