Цикл foreach в Laravel через массив в Blade

У меня есть массив, который я хотел бы вывести в шаблоне редактирования в цикле 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 через массив теперь работает нормально. Спасибо всем за вашу помощь!

Как определяется отношение cage/аксессор?

Vivick 14.03.2024 10:52

Что ты сделал var_dump? Что такое ->cage?

brombeer 14.03.2024 10:53

Что, если вы добавите is_array() внутри foreeach? Потому что это не массив. Это строка

Abdulla Nilam 14.03.2024 10:58

@brombeer и Вивик Я обновил пост, внося изменения, чтобы объяснить поле клетки. Vardump я сделал это var_dump($post->cage);

Missblues 14.03.2024 10:59

Возможно, массив, приведенный в текстовом поле, не работает. попробуйте работать с json_encode и json_decode, если ваш столбец является текстовым полем. также, для понимания, попробуйте добавить if (!is_array($c)) dump($c) в цикл foreach (внимание: дамп иногда работает только внутри @php)

Alex 14.03.2024 11:10

@Alex Я выполнил foreach json_decode (json_decode($post->cage) как $c), но htis дает json_decode(): аргумент №1 ($json) должен иметь строковый тип, массив выдает ошибку, а при использовании кодирования он выдает для меня аргумент foreach() должен иметь тип массива|объекта, строка с дампом дает это "middle" и "joe2"

Missblues 14.03.2024 11:29

@Missblues, очевидно, ваши значения иногда представляют собой массивы, а иногда строки. добавьте ранее упомянутые проверки is_array или is_string и продолжайте дальше.

Alex 14.03.2024 11:42

поделитесь моделью сообщений, возможно, вам нужно добавить клетку в $with

Puneet Sharma 14.03.2024 12:13

Спасибо всем за ваш вклад. Текстовое поле и проблема с массивом заставили меня задуматься. Я изменил тип поля. Вместо текстового поля я изменил его на поле json. Цикл foreach теперь работает нормально.

Missblues 14.03.2024 13:01

@missblues Пожалуйста, опубликуйте свое решение как обычный ответ и отметьте его как принятое, как только SO позволит.

Marcin Orlowski 14.03.2024 14:05
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
10
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решением было бы изменить тип столбца на 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.

Missblues 14.03.2024 16:12

Другие вопросы по теме