Laravel — Попытка получить свойство не-объекта в коллекции

#php #laravel #collections

#php #laravel #Коллекции

Вопрос:

Я пытаюсь передать некоторые значения SEO в блейд-вид.

Мой вид блейда выглядит следующим образом :

 @if(!empty($page_data))
        <?php $page_data = $page_data[0]; ?>
        <title>{{ $page_data->page_seo_title }}</title>
        <meta name="description" content="{{ $page_data->page_seo_desc }}">
        <input type="hidden" name="page_id" class="page_id" value="{{ $page_data->page_id }}">
@endif
  

Когда я передаю следующую коллекцию в представление, я получаю ошибку:

Попытка получить свойство не-объекта

Моя коллекция выглядит следующим образом :

 Collection {#286 ▼
  #items: array:1 [▼
    0 => array:2 [▼
      "page_seo_title" => "SEO Title"
      "page_seo_desc" => "SEO Desc"
    ]
  ]
}
  

Я создаю коллекцию, вот так :

 // Set Page Data
            $page_data  = collect(
                [
                    [
                        'page_seo_title' => 'SEO Title',
                        'page_seo_desc' => 'SEO Desc'
                    ]
                ]
            );
  

Нужно ли мне определить что-то еще в коллекции, чтобы оно было «подобрано»?

Стоит отметить, что page_data работает на страницах, на которых выполняется запрос Eloquent, так что это не проблема. Мне нужно установить только эти динамические страницы. Поэтому в идеале мне не нужно менять логику блейда / просмотра. Просто логика коллекции / контроллера.

Комментарии:

1. $page_data = collect( [ ‘page_seo_title’ => ‘SEO Title’, ‘page_seo_desc’ => ‘SEO Desc’ ]); или вам нужно $page_data[0]-> page_seo_title в blade

2. Привет @iCoders это, в свою очередь, возвращает ошибку: Неопределенное смещение: 0 :/

3. затем попробуйте преобразовать коллекцию в массив, например $page_data-> toArray(); затем распечатайте его и проверьте, как будут поступать данные

4. Используйте $page_data['page_seo_title'] вместо $page_data->page_seo_title

5. Тогда, возможно, $page_data это вообще пустая коллекция. Вы не можете использовать empty() для объектов коллекции, потому что они всегда возвращают false. Измените строку с @if(!empty($page_data)) на @if(!$page_data->isEmpty()) и посмотрите, повторится ли ошибка снова?

Ответ №1:

я обновил небольшой пример, основанный на вашем коде и его тестировании.попробуйте один раз

  $page_data  = collect(
                        [
                            [
                                'page_seo_title' => 'SEO Title',
                                'page_seo_desc' => 'SEO Desc'
                            ]
                        ]
                    );

//here it will print all data 
                    print_r($page_data->toArray());

                    $data=$page_data->toArray();

// here it will print particular data
                echo    $data[0]['page_seo_title'];
  

Обновлено

в вашем контроллере

 $data=$page_data->toArray();

        return view('viewname',['data',$data];
  

в вашем блейде

 @if(!empty($data))
    <?php $new_data = $data[0]; ?>
    <title>{{ $new_data['page_seo_title'] }}</title>
    <meta name="description" content="{{ $new_data['page_seo_desc'] }}">
    <input type="hidden" name="page_id" class="page_id" value="{{ $new_data['page_id'] }}">
  

Комментарии:

1. К сожалению, с этим больше ничего не происходит… Та же ошибка: Попытка получить свойство не-объекта

2. Могу ли я, возможно, попробовать какую-то логику в блейде — Проверить наличие объекта, если не проверить наличие элемента?

3. И если вы передадите его $page_data->first() в свой контроллер, вам не понадобятся <?php теги в вашем представлении блейда

Ответ №2:

В вашей коллекции нет свойства page_id, но вы получаете к нему доступ в своем блейд-представлении. пожалуйста, проверьте свою эту строку

 <input type="hidden" name="page_id" class="page_id" value="{{ $page_data->page_id }}">
  

там вы получаете доступ к page_id, но ваша коллекция не содержит свойства с page_id.