php - multitabla - laravel find by field
Cómo alias el nombre de una columna en Eloquent (3)
En Laravel 5.4 (no sé si también se aplica la versión anterior) puede hacerlo con el método de select
:
Products::where("actice", "=", true)
->joinWithTags
->select(''tags.name AS tag_name'', ''products.*'')
->get();
Al menos para mí esto es más limpio.
Tengo un modelo elocuente llamado Eloquent:
Products::where("actice", "=", true)->get()->toArray();
Ahora quiero agregarle una declaración de unión, he definido un scopeQuery con:
public function scopeJoinWithTags($query)
{
return $query->leftJoin("tags", "tags.id", "=", "products.tag_id");
}
Entonces nuestra consulta principal cambia a:
Products::where("actice", "=", true)->joinWithTags->get()->toArray();
Lo que recibo está bien, es lo que espero, pero quiero cambiar la propiedad de nombre de la tabla de etiquetas a tag_name, ¿cómo debo hacer eso? Quiero decir, digo en algún lugar de mi consulta para:
tags.name AS tag_name
Así que en la matriz de resultados final lo hago:
$result[$i][''tag_name''];
Mientras que ahora tengo que:
$result[$i][''name''];
La forma más sencilla de hacerlo sería agregar los campos que necesita al método get()
y alias a los que desea cambiar el nombre allí.
Products::where("actice", "=", true)
->joinWithTags
->get([''tags.name AS tag_name'', ''products.*''])
->toArray();
También hay una forma más limpia de lograr esto.
Puedes aprovechar los mutadores de laravel
public function getTagNameAttribute()
{
return $this->attributes[''name''];
}
Espero que esto ayude