Reputation: 9183
I have an eloquent model named Eloquent:
Products::where("actice", "=", true)->get()->toArray();
Now I want to add join-statement to it, I have defined a scopeQuery with:
public function scopeJoinWithTags($query)
{
return $query->leftJoin("tags", "tags.id", "=", "products.tag_id");
}
Then our main query changes to:
Products::where("actice", "=", true)->joinWithTags->get()->toArray();
What I get is OK, it is what I do expect, but I want to change the name property of tags table to tag_name, how should I do that? I mean, i say somewhere in my query to:
tags.name AS tag_name
So that in the final result array I do :
$result[$i]['tag_name'];
While now I have to :
$result[$i]['name'];
Upvotes: 47
Views: 123210
Reputation: 1641
This is my go-to. Good for backward compatibility with an old column name.
Add the following to your model
protected $appends = ['old_column_name'];
public function getOldColumnNameAttribute() {
return $this->attributes['new_column_name'];
}
public function setOldColumnNameAttribute($value) {
$this->attributes['new_column_name'] = $value;
return $this;
}
Upvotes: 0
Reputation: 15971
There is also a cleaner way to achieve this
You can take advantage of laravel mutators
public function getTagNameAttribute()
{
return $this->attributes['name'];
}
Hope this helps
Upvotes: 19
Reputation: 598
On Laravel 5.4 (I don't know if earlier version also apply) you can do that with the select
method:
Products::where("actice", "=", true)
->joinWithTags
->select('tags.name AS tag_name', 'products.*')
->get();
At least for me this is cleaner.
Upvotes: 20
Reputation: 2520
Simplest way to do this would be to add the fields you need to the get()
method and alias the ones you want to rename there.
Products::where("actice", "=", true)
->joinWithTags
->get(['tags.name AS tag_name', 'products.*'])
->toArray();
Upvotes: 83