У меня есть массив, который я хотел бы вывести в шаблоне редактирования в цикле foreach. Но я получаю сообщение об ошибке: невозможно получить доступ к смещению строки типа в строке.
В блейде у меня есть это:
@foreach ($post->cage as $c )
<div data-repeater-item = "">
<div class = "form-group">
<label class = "col-sm-1 control-label">Make</label>
<label class = "col-sm-1 control-label">Comment</label>
<div class = "col-sm-2">
<input type = "text" name = "cage[1][comment]" value = "{{ $c['comment'] }}" class = "form-control">
</div>
</div>
</div>
@endforeach
Контроллер очень простой
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id): Response
{
return response()->view('post.edit', [
'post' => Posts::findOrFail($id),
]);
}
вардамп дает это
array(3) {
["level"]=> string(6) "middle"
["comment"]=> string(4) "joe2"
[0]=> array(2) {
["level"]=> string(6) "middle"
["comment"]=> string(4) "joe2" }
}
Есть идеи, как сделать foreach для получения значения? Нужно ли что-то добавлять в контроллер? декодировать или что? заранее спасибо
Дополнительное редактирование. Cage — это текстовое поле, в котором может храниться массив.
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->text('zone')->nullable();
$table->text('cage')->nullable();
});
}
В файле модели
protected $casts = [
'cage' => 'array'
];
edit2: измените текстовое поле на поле json. Цикл foreach через массив теперь работает нормально. Спасибо всем за вашу помощь!
Что ты сделал var_dump? Что такое ->cage?
Что, если вы добавите is_array() внутри foreeach? Потому что это не массив. Это строка
@brombeer и Вивик Я обновил пост, внося изменения, чтобы объяснить поле клетки. Vardump я сделал это var_dump($post->cage);
Возможно, массив, приведенный в текстовом поле, не работает. попробуйте работать с json_encode и json_decode, если ваш столбец является текстовым полем. также, для понимания, попробуйте добавить if (!is_array($c)) dump($c) в цикл foreach (внимание: дамп иногда работает только внутри @php)
@Alex Я выполнил foreach json_decode (json_decode($post->cage) как $c), но htis дает json_decode(): аргумент №1 ($json) должен иметь строковый тип, массив выдает ошибку, а при использовании кодирования он выдает для меня аргумент foreach() должен иметь тип массива|объекта, строка с дампом дает это "middle" и "joe2"
@Missblues, очевидно, ваши значения иногда представляют собой массивы, а иногда строки. добавьте ранее упомянутые проверки is_array или is_string и продолжайте дальше.
поделитесь моделью сообщений, возможно, вам нужно добавить клетку в $with
Спасибо всем за ваш вклад. Текстовое поле и проблема с массивом заставили меня задуматься. Я изменил тип поля. Вместо текстового поля я изменил его на поле json. Цикл foreach теперь работает нормально.
@missblues Пожалуйста, опубликуйте свое решение как обычный ответ и отметьте его как принятое, как только SO позволит.






Решением было бы изменить тип столбца на json вместо text: обновите миграцию posts.cage с:
$table->text('cage')->nullable();
к:
$table->json('cage')->nullable();
Или вот это (если вы хотите, чтобы по умолчанию всегда был пустой массив):
$table->json('cage')->nullable()->default('[]');
Кроме того, могу ли я также предложить добавить ключ в вашу форму:
@foreach ($post->cage as $cageKey => $cage)
<div data-repeater-item = "{{$cageKey}}">
<div class = "form-group">
<label class = "col-sm-1 control-label">Make</label>
<label class = "col-sm-1 control-label">Comment</label>
<div class = "col-sm-2">
<input type = "text" name = "cage[{{$cageKey}}][comment]" value = "{{ $cage['comment'] }}" class = "form-control">
</div>
</div>
</div>
@endforeach
Большое спасибо. Я уже подумал, что в этом будет проблема. Благодарим вас за добавление ключей и обновление foreach.
Как определяется отношение
cage/аксессор?