Adding new property to Eloquent Collection

Shafi picture Shafi · Nov 18, 2017 · Viewed 15.4k times · Source

Trying to add new property to existing collection and access that.

What I need is something like:

$text = Text::find(1);  //Text model has properties- id,title,body,timestamps
$text->user = $user;

And access the user via, $text->user.

Exploring on documentation and SO, I found put, prepend, setAttribute methods to do that.

$collection = collect();
$collection->put('a',1);
$collection->put('c',2);
echo $collection->c; //Error: Undefined property: Illuminate\Support\Collection::$c

Again,

$collection = collect();
$collection->prepend(1,'t');
echo $collection->t = 5; //Error: Undefined property: Illuminate\Support\Collection::$t

And

$collection = collect();
$collection->setAttribute('c',99); // Error: undefined method setAttribute
echo $collection->c;

Any help?

Answer

Marcin Nabiałek picture Marcin Nabiałek · Nov 18, 2017

I think you mix here Eloquent collection with Support collection. Also notice when you are using:

$text = Text::find(1);  //Text model has properties- id,title,body,timestamps
$text->user = $user;

you don't have here any collection but only single object.

But let's look at:

$collection = collect();
$collection->put('a',1);
echo $collection->c; //Error: Undefined property: Illuminate\Support\Collection::$c

You are taking c and you don't have such element. What you should do is taking element that is at a key like this:

echo $collection->get('a');

or alternatively using array access like this:

echo $collection['a'];

Also notice there is no setAttribute method on Collection. There is setAttribute method on Eloquent model.