Modelo laravel utilidades

Vamos a ver las utilidades más frecuentes que se usan dentro de modelos, para faciltar el tratamiento de información de la base de datos en laravel.

Índice
  1. Propiedades
  2. Agregar atributos
  3. Enviar colección a la vista
  4. URL Amigables
  5. Consulta sql laravel con Query scopes

Propiedades

Son variables que se declaran para dar funcionalidad al modelo.

withCount

Se utiliza en relaciones muchos a muchos (n:n), para mostrar además de los campos del propio modelo, un contador de las coincidencias de la otra tabla.

Declarar variable withCount de tipo protected y asignarle un array con el metodo o los metodos deseados.

protected $withCount = ['metodoDelModelo','reviews'];

la función o metodo es

//relacion n:n inversa
public function  metodoDelModelo(){
return $this->belongsToMany('App\Models\Modelo');
}

Devuelve los datos del modelo y el contador adicional de registros coincidented de la otra tabla

{"id": 1,
"title": "Laborum unde iste tenetur explicabo nihil ipsa."
...
,"students_count": 1
,"reviews_count": 1
}

Agregar atributos

Los atributos sirven para recoger datos de relaciones del modelo con otros modelos y guardarlo para disponer de esos datos para operar con ellos

Por ejemplo una tabla de cursos, quiere mostrar la calificación de los cursos guardado en otra tabla distinta. Se declara la función guardando palabras clave get y Attribute.

public function getReviewsAttribute(){
return $this->reviews;
}

Destacar el detalle de los paréntesis, ya que sin paréntesis $this->reviews devuelve la colección, pero con paréntesis devuelve el tipo de realción y no la colección.

Valor medio de registros

Aprovechando que se recibe la colección, se puede operar con los valores, por ejemplo que traiga la media de valoraciones, con el método avg('campo') y como parámetro el campo del que se va a hacer la media.

También se puede acceder a la nueva propiedad, indicada en el punto anterior, colocando el nombre guión bajo y la palabra count reviews_count

public function getRatingAttribute(){
if($this->reviews_count){
return $this->reviews->avg('rating');
}else{
return 5;
}
}

Ejemplo para ver lo que devuelve, donde 3 es el id, y rating es el método

return Course::find(3)->rating;

Ejemplo de como hacer consultas sql en laravel para ver lo que devuelve, haciendo una select del campo status=3, orden por últimos id, y get para recibir la colección

return Course::where('status','3')->latest('id')->get();

También se puede decir que recupere solo un determinado numero de registros con la función take, por ejemplo 12.

return Course::where('status','3')->latest('id')->get()->take(12);

Enviar colección a la vista

Para mostrar al usuario la información obtenida, se pasa la colección con el método compact('variable'), pasando como variable, la que contiene todos los datos

public function __invoke(){
$courses = Course::where('status','3')->latest('id')->get()->take(12);
return view('welcome', compact('courses'));
}

URL Amigables

Si un modelo tiene en su tabla de base de datos un campo slug, se puede acceder a la url amigable en vez del id del registro, y para ello hay que definir en el propio modelo, el método getRouteKeyName.

public function getRouteKeyName(){
return "slug";
}

Así cuando se llame a la ruta pasando como parámetro el objeto modelo, ya sabe que debe mostrar el slug.

<a href="{{route('courses.post', $post)}}">Ver post</a>

Consulta sql laravel con Query scopes

Los query scopes son filtros que se aplican a la select laravel eloquent, para condicionar la sentencia where sql laravel, y que se ejecute parte de la sentecia select, solo si la condición where tiene datos.

Por ejemplo, si un modelo de cursos hace referencia a otros dos modelos, uno de categorías y otro de niveles, con relación uno a muchos. Es decir, un curso pertenece a una categoría y pertenece a un nivel.

Una sentencia select where laravel sql donde traiga los registros de una categoría y un nivel determinado sería:

$cursos= Curso::where('estado', 3)
->where('categoria_id', $this->categoria_id)
->where('nivel_id', $this->nivel_id)
->latest('id')
->paginate(8);

Pues en el caso de que la categoría o el nivel sean nulos, de consulta sql laravel no se recibiría ningún registro.

¿Cómo utilizar los query scopes?

Para que se puedan utilizar los query scopes hay que declararlo en el modelo a través de un método. En este método es donde se pone la condición de si tiene datos.

El método o función tiene que comenzar por la plalabra clave scope, seguido de una palabra. También hay que pasarle por parámetro, mínimo la variable query, y opcional las variables que hacen falta para la condición.

En este ejemplo se pasa el id de la categoría, para obtener los cursos. Se devuelve la query con el filtro where aplicado.

public function scopeCategoria($query, $categoria_id){
if($categoria_id){
return $query->where('category_id', $category_id);
}
}

También de igual forma crear la función para el nivel.

public function scopeNivela($query, $nivel_id){
if($nivel_id){
return $query->where('nivel_id', $nivel_id);
}
}

Si el parámetro esta vacío o nulo, no se ejecuta el filtros where, y por tanto no entra en evaluación.

QueryScopes en el controlador

Una vez creado los métos en el modelo, ya se pueden llamar en el componente o controlador. En vez de poner el método where, se llama a los creados con queryScopes.

No hace falta poner el prefijo scope, ni pasar el parámetro query, porque laravel eloquent ya sabe interpretar que es un queryScope. Así solo llamar al nombre de la función sin prefijo, y pasar por parámetro el dato a filtrar.

$courses = Course::where('status', 3)
->categoria($this->categoria_id)
->nivel($this->nivel_id)
->latest('id')
->paginate(8);

Espero te sirva de utilidad!!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir