【问题标题】:How to alias the name of a column in Eloquent如何在 Eloquent 中为列的名称起别名
【发布时间】:2015-01-13 12:03:36
【问题描述】:

我有一个名为 Eloquent 的 eloquent 模型:

Products::where("actice", "=", true)->get()->toArray();

现在我想向它添加连接语句,我已经定义了一个范围查询:

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

然后我们的主要查询变为:

Products::where("actice", "=", true)->joinWithTags->get()->toArray();

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

 tags.name AS tag_name

所以在最终的结果数组中我会这样做:

$result[$i]['tag_name'];

现在我必须:

$result[$i]['name'];

【问题讨论】:

标签: php laravel eloquent


【解决方案1】:

还有一种更简洁的方法可以实现这一点

你可以利用 laravel mutators

public function getTagNameAttribute()
{
    return $this->attributes['name'];
}

希望对你有帮助

【讨论】:

    【解决方案2】:

    在 Laravel 5.4(我不知道早期版本是否也适用)上,您可以使用 select 方法:

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

    至少对我来说这更干净。

    【讨论】:

    • 如何重命名产品表?
    【解决方案3】:

    执行此操作的最简单方法是将您需要的字段添加到 get() 方法并为您要在其中重命名的字段添加别名。

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

    【讨论】:

    • 你能告诉我第二个参数是什么吗? ''动作。*'` ?我已将其更改为 products.* 并且可以正常工作。
    • 糟糕,抱歉,应该是产品。* 它只是意味着包含产品表的所有字段。
    • 这是我使用的方法,但需要注意的是,其他框架本身使用关联数组来处理这个问题。很遗憾这个被 Laravel 忽略了。
    猜你喜欢
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多