如何在Eloquent中为列的名称添加别名

Mos*_*ebi 27 php laravel eloquent

我有一个名为Eloquent的雄辩模型:

Products::where("actice", "=", true)->get()->toArray();
Run Code Online (Sandbox Code Playgroud)

现在我想为它添加join-statement,我已经定义了一个scopeQuery:

public function scopeJoinWithTags($query)
    {
        return $query->leftJoin("tags", "tags.id", "=", "products.tag_id");
    }
Run Code Online (Sandbox Code Playgroud)

然后我们的主要查询更改为:

Products::where("actice", "=", true)->joinWithTags->get()->toArray();
Run Code Online (Sandbox Code Playgroud)

我得到的是好的,这是我所期望的,但我想将tags表的name属性更改为tag_name,我应该怎么做?我的意思是,我在我的查询中的某个地方说:

 tags.name AS tag_name
Run Code Online (Sandbox Code Playgroud)

所以在最终结果数组中我做了:

$result[$i]['tag_name'];
Run Code Online (Sandbox Code Playgroud)

虽然现在我必须:

$result[$i]['name'];
Run Code Online (Sandbox Code Playgroud)

tur*_*two 49

最简单的方法是将get()方法所需的字段添加到您想要重命名的字段中.

Products::where("actice", "=", true)
    ->joinWithTags
    ->get(['tags.name AS tag_name', 'products.*'])
    ->toArray();
Run Code Online (Sandbox Code Playgroud)

  • 哎呀抱歉,是的它应该是产品.*它只是意味着包括产品表的所有字段. (2认同)

Dis*_*urb 9

在Laravel 5.4(我不知道早期版本是否也适用)你可以用这个select方法做到这一点:

Products::where("actice", "=", true)
    ->joinWithTags
    ->select('tags.name AS tag_name', 'products.*')
    ->get();
Run Code Online (Sandbox Code Playgroud)

至少对我来说这更清洁.


Adn*_*taz 6

还有一种更清洁的方法来实现这一目标

你可以利用laravel mutators

public function getTagNameAttribute()
{
    return $this->attributes['name'];
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助