Property [title] does not exist on this collection instance - php

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?

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;

$about = DB::where('page', 'about-me')->first();
in stead of get().
It works on my project. Thanks.

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 https://laravel.com/docs/master/collections#method-pluck.
$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

Related

Laravel 8 Property [id] does not exist on this collection instance [duplicate]

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?
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;
$about = DB::where('page', 'about-me')->first();
in stead of get().
It works on my project. Thanks.
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 https://laravel.com/docs/master/collections#method-pluck.
$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

How to correctly update more than 1 data in database [duplicate]

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?
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;
$about = DB::where('page', 'about-me')->first();
in stead of get().
It works on my project. Thanks.
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 https://laravel.com/docs/master/collections#method-pluck.
$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

how to stop laravel from getting error if table is null

i want my code to keep working if the table return null
i tried using if(empty) bla bla bla, but is not seem to be the problem
the problem is laravel don't let me call function on null
#php($article = article::find($id)->get())
error : "Call to a member function get() on null"
If aritcle::find($id) returns null, it should solve the problem:
#if($article = article::find($id) != null)
// If the aricle::find($id) returns anything but null, this block will be reached.
#endif
I think that is better to you to send the data to the view from the controller, instead of using blade directives to fetch data.
something like this:
//Within some controller:
public function show($id)
{
$article = article::find($id);
return view('your-view')->with($article);
}
Then you can check if $article is null using blade:
#if(empty($article))
// The article is empty
#endif
Using ->get() after find() is unnecessary. find() automatically returns the model that matches the primary key provided. You will get errors if you attempt to access $article after find() fails, but it will stop you from getting the error you posted.

Undefined property: Illuminate\Database\Eloquent\Collection::$id Laravel 4

i'm using laravel v 4.2..
i want to create update record.
can you help me.. what's wrong with this code...
this is my code :
MatakuliahsController.php
public function edit($id)
{
//$matakuliahs = $this->matakuliahs->find($id);
$matakuliahs = Matakuliah::where('id','=',$id)->get();
if(is_null($matakuliahs)){
return Redirect::route('matakuliahs.index');
}
return View::make('matakuliahs.edit',compact('matakuliahs'));
}
edit.blade.php
{{ Form::open(array('autocomplete' => 'off', 'method' => 'PATCH', 'route' => array('matakuliahs.update', $matakuliahs->id))) }}
...
{{ Form::close() }}
Error is :
Undefined property: Illuminate\Database\Eloquent\Collection::$id (View: C:\xampp\htdocs\Laravel 4\projectLaravel\app\views\matakuliahs\edit.blade.php)
thanks for your attention and your help..
What you are trying to get is a relationship on a collection of models, the relationship exists on the object in that collection. You can use first() to return the first one or you need to use loop for each one get their items
$matakuliahs = Matakuliah::where('id','=',$id)->get()->first();
$matakuliahs = Matakuliah::where('id','=',$id)->get();
return a colllection of object where the id is equal to $id. in this case will return a collection of 1 element and not the object itself of course if the id is unique, so when you do:
$matakuliahs->id
you are triying to acess the id properties of the $matakuliahs object but the $matakuliahs in this case is not a object is a collection.
to solve this problem you can do:
1.
$matakuliahs = Matakuliah::where('id','=',$id)->get()->first();
or
$matakuliahs = Matakuliah::where('id','=',$id)->first();
to get the object and acess the properties.
2. on you view:
#foreach( $matakuliahs as $matakuliah)
//your code here
#endforeach
hope this help. thanks
Try this in your controller method:
$matakuliahs = Matakuliah::find($id);
And just pass it to the view.
The method
MyModel::find($id);
Or relationship with Eloquent no works on Laravel 4.2 just next solution
$myModel= new MyModel;
$myModel->setConnection('mysql2');
$myModel= $myModel->where('id', $id)->first();

laravel how to get single row and post to view

in MySql database i have systemSetting table and this have any data.
in this table i have this fields :
id - site_copyright - date
i want to fill form with this single row.
{{ Form::model($siteSettings) }}
{{ Form::label('site_copyright' , 'copy right') }}
{{ Form::text('site_copyright', null , array('id'=>'site_copyright' )) }}
{{ Form::label('site_copyright' , 'copy right') }}
{{ Form::text('site_copyright', null , array('id'=>'site_copyright' )) }}
{{ Form::close() }}
UPDATE:
in CONTROLLER of that i have this:
public function getIndex()
{
$siteSettings = SystemSetting::all();
return View::make('back_end.layouts.manageHeaders')->with('siteSettings', $siteSettings);
}
in Result, form could not parse data to input fields.
i get error for this :
$siteSettings->site_copyright
This is a duplicate of many questions, such as this: Laravel display table record using query
The short answer is: use first() method to get a single entry.
You're using form model binding, so change your controller to:
public function getIndex()
{
$siteSettings = new SystemSetting;
return View::make('back_end.layouts.manageHeaders', compact('siteSettings'));
}
Query work on 5.1 or more
return DB::table('users')->where('id', $id)->value('field_name');
//if lower version of laravel like 4.2
DB::table('users')->where('id', $id)->pluck('field_name');

Categories