Property [Title] Does Not Exist on This Collection Instance
I Am Following Laracasts' Videos: Basic Model/Controller/View Workflow. I Have a Table Holds Contact Information. Create Table `About` ( `Id` Int(10) Unsigned...
I am following Laracasts' videos: Basic Model/Controller/View Workflow.
I have a table holds contact information.
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
I am trying to pass data to view using the following code in the controller file:
public function index()
{
$about = Page::where('page', 'about-me')->get(); //id = 3
return view('about', compact('about'));
}
When I try to show the code as shown below,
@section('title')
{{$about->title}}
@stop
@section('content')
{!! $about->content !!}
@stop
I get error that says:
Property [title] does not exist on this collection instance. (View: E:\laragon\www\newsite\resources\views\about.blade.php)
But if I change the retrieving method in the controller file, it works.
public function index()
{
$about = Page::find(3);
return view('about', compact('about'));
}
When I use dd($about) in the first case (where()->get()) the data is encapsulated by an array. In the second case (find(3)) it displays data as expected.
What am i doing wrong?
8 Answers
When you're using get() you get a collection. In this case you need to iterate over it to get properties:
@foreach ($collection as $object)
{{ $object->title }}
@endforeach
Or you could just get one of objects by it's index:
{{ $collection[0]->title }}
Or get first object from collection:
{{ $collection->first() }}
When you're using find() or first() you get an object, so you can get properties with simple:
{{ $object->title }}
With get() method you get a collection (all data that match the query), try to use first() instead, it return only one element, like this:
$about = Page::where('page', 'about-me')->first();
A person might get this while working with factory functions, so I can confirm this is valid syntax:
$user = factory(User::class, 1)->create()->first();
You might see the collection instance error if you do something like:
$user = factory(User::class, 1)->create()->id;
so change it to:
$user = factory(User::class, 1)->create()->first()->id;
You can try using first() instead of method get()
$about = DB::where('page', 'about-me')->first();
You Should Used Collection keyword in Controller. Like Here..
public function ApiView(){
return User::collection(Profile::all());
}
Here, User is Resource Name and Profile is Model Name. Thank You.
$about->first()->id or
$stm->first()->title and your problem is sorted out.
As result of $about = Page::where('page', 'about-me')->get() is a laravel collection, you can get a specific attribute like title using pluck() method which is described in .
$titles = $about->pluck( 'title' )
@foreach($titles as $title)
{{ $title }}
@endforeach
The stored information in about valiable, is in collection format, so you just need to loop through it.
@if(count($about))
@foreach($about as $page)
{{$page->title}}
@endforeach
@endif