Как псевдоним имени столбца в Eloquent

У меня есть красноречивая модель с названием Eloquent:

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

Теперь я хочу добавить к нему инструкцию join, я определил scopeQuery с помощью:

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

Затем наш основной запрос изменяется на:

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

Что я получаю в порядке, это то, чего я ожидаю, но я хочу изменить свойство name таблицы тегов на tag_name, как мне это сделать? Я имею в виду, я скажу где-то в своем запросе:

 tags.name AS tag_name

Так что в конечном массиве результатов я делаю:

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

Пока я должен:

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

Ответ 1

Самый простой способ сделать это - добавить поля, которые вам нужны, к методу get() и псевдоним тех, которые вы хотите переименовать там.

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

Ответ 2

В Laravel 5.4 (я не знаю, применим ли предыдущая версия), вы можете сделать это с помощью метода select:

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

По крайней мере, для меня это чище.

Ответ 3

Существует также более чистый способ достичь этого.

Вы можете воспользоваться мутаторами laravel

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

Надеюсь, что это поможет