У меня есть красноречивая модель с именем Eloquent:
Products::where("actice", "=", true)->get()->toArray();
Теперь я хочу добавить к нему join-statement, я определил 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'];
Самый простой способ сделать это – добавить поля, которые вам нужны, к методу get()
и псевдоним тех, которые вы хотите переименовать.
Products::where("actice", "=", true) ->joinWithTags ->get(['tags.name AS tag_name', 'products.*']) ->toArray();
В Laravel 5.4 (я не знаю, применим ли предыдущая версия), вы можете сделать это с помощью метода select
:
Products::where("actice", "=", true) ->joinWithTags ->select('tags.name AS tag_name', 'products.*') ->get();
По крайней мере, для меня это чище.
Существует также более чистый способ достичь этого
Вы можете использовать мутаторы laravel
public function getTagNameAttribute() { return $this->attributes['name']; }
Надеюсь это поможет