Свойство [title] не существует в этом экземпляре коллекции

Я слежу за видео Laracasts: Базовая модель / Контроллер / Просмотр рабочего процесса.

У меня в таблице хранится контактная информация.

CREATE TABLE `about` (
`id` int(10) UNSIGNED NOT NULL,
`title` varchar(500) COLLATE utf8_unicode_ci NOT NULL,
`content` text COLLATE utf8_unicode_ci,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Я пытаюсь передать данные для просмотра, используя следующий код в файле контроллера:

public function index()
{
    $about = Page::where('page', 'about-me')->get(); //id = 3

    return view('about', compact('about'));
}

Когда я пытаюсь показать код, как показано ниже,

@section('title')
    {{$about->title}}
@stop

@section('content')
    {!! $about->content !!}
@stop

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

Свойство [title] не существует в этом экземпляре коллекции. (Просмотр: E:\laragon\www\newsite\resources\views\about.blade.php)

Но если я изменю метод получения в файле контроллера, он будет работать.

public function index()
{
    $about = Page::find(3);

    return view('about', compact('about'));
}

Когда я использую dd($about) в первом случае (where()->get()) данные инкапсулированы массивом. Во втором случае (find(3)) он отображает данные, как и ожидалось.

Что я делаю неправильно?

8 ответов

Решение

Когда вы используете get() Вы получаете коллекцию. В этом случае вам нужно перебрать его, чтобы получить свойства:

@foreach ($collection as $object)
    {{ $object->title }}
@endforeach

Или вы можете просто получить один из объектов по его индексу:

{{ $collection[0]->title }}

Или получить первый объект из коллекции:

{{ $collection->first() }}

Когда вы используете find() или же first() Вы получаете объект, поэтому вы можете получить свойства с помощью простого:

{{ $object->title }}

С get() метод получения коллекции (все данные, соответствующие запросу), попробуйте использовать first() вместо этого он возвращает только один элемент, например:

 $about = Page::where('page', 'about-me')->first();

Человек может получить это при работе с заводскими функциями, поэтому я могу подтвердить, что это действительный синтаксис:

$user = factory(User::class, 1)->create()->first();

Вы можете увидеть ошибку экземпляра коллекции, если сделаете что-то вроде:

$user = factory(User::class, 1)->create()->id;

так что измените его на:

$user = factory(User::class, 1)->create()->first()->id;
$about = DB::where('page', 'about-me')->first(); 

вместо get(),

Это работает на моем проекте. Благодарю.

Вы должны использовать коллекцию ключевых слов в контроллере. Как здесь..

public function ApiView(){
    return User::collection(Profile::all());
}

Здесь пользователь - это имя ресурса, а профиль - имя модели. Благодарю вас.

Как результат $about = Page::where('page', 'about-me')->get()это коллекция laravel, вы можете получить определенный атрибут, например заголовок, используя pluck()метод, описанный в https://laravel.com/docs/master/collections#method-pluck.

      $titles = $about->pluck( 'title' )

@foreach($titles as $title)
    {{ $title }}
@endforeach

$about->first()->id или$stm->first()->title и ваша проблема решена.

Информация, хранящаяся в about valiable, находится в формате коллекции, поэтому вам просто нужно просмотреть ее в цикле.

      @if(count($about))
   @foreach($about as $page)
    {{$page->title}}
   @endforeach
@endif
Другие вопросы по тегам