Mostafa Talebi
Mostafa Talebi

Reputation: 9183

How to alias the name of a column in Eloquent

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

Answers (4)

tylersDisplayName
tylersDisplayName

Reputation: 1641

This is my go-to. Good for backward compatibility with an old column name.

Add the following to your model

  1. protected $appends = ['old_column_name'];
  2. public function getOldColumnNameAttribute() {
      return $this->attributes['new_column_name'];
    }
    
    public function setOldColumnNameAttribute($value) {
      $this->attributes['new_column_name'] = $value;
    
      return $this;   
    }
    

Upvotes: 0

FULL STACK DEV
FULL STACK DEV

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

Disturb
Disturb

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

turntwo
turntwo

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

Related Questions