Свойство [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