Uno de los cambios que trae Laravel 5.3 es que ahora el Constructor de Consultas (o Query Builder) Fluent devuelve una colección (instancia de Illuminate\Support\Collection) en vez de un array plano. Esto se ha hecho con dos objetivos: 1. Mantener consistencia entre lo que se obtiene de una consulta con Eloquent y de una consulta con Fluent, 2. Poder aprovechar automáticamente todas las ventajas que nos brinda trabajar con colecciones en vez de arrays.
En esta lección, conocerás los detalles de este cambio así como algunos tips para desarrollar usando las colecciones de Laravel:
Notas
Por Clemir Rondón.
Si tienes alguna aplicación en Laravel 5.2 no dejes de actualizarla: Cómo actualizar a Laravel 5.3 desde 5.2. Además, te recomendamos crear pruebas para tu aplicación con el componente de pruebas de Laravel y así podrás estar seguro, de una manera más rápida y eficiente, que tu aplicación sigue funcionando correctamente.
En la lección La nueva variable $loop en la directiva foreach de Blade se trabajó con el modelo Post:
php artisan make:model Post -m
Y luego agregando la relación con el modelo User:
public function user() { return $this->belongsTo(App\User::class); }
La migración de la tabla posts contiene en su método up:
Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->unsignedInteger('user_id'); $table->text('title'); $table->text('content'); $table->timestamps(); });
Los seeders para crear algunos datos de ficticios usando model factories. Luego, se ejecuta:
composer dump-autoload
Para ejecutar las migraciones y que posteriormente se generen los datos ficticios para cada tabla:
php artisan migrate --seed
Con la consola de comandos de Laravel Tinker podemos interactuar con nuestra aplicación:
php artisan tinker
Para consultar todos los usuarios registrados en la aplicación usando el ORM Eloquent:
$users = App\User::all();
que retorna una colección con namespace Illuminate\Database\Eloquent\Collection.
Para consultar todos los usuarios registrados en la aplicación usando Fluent:
$users = DB::table('users')->get();
Lo que devuelve también una colección pero con namespace Illuminate\Support\Collection.
La diferencia entre las dos es que la colección de Eloquent se extiende de la colección base Illuminate\Support\Collection.
Puedes ver todos los métodos disponibles de cada una en la documentación oficial:
Para añadir los nuevos campos de las tablas y generar nuevamente los seeder podemos ejecutar:
php artisan migrate:refresh --seed
Usando App\User::find(1)->posts
retorna todos los posts relacionados con dicho usuario y usando App\User::find(1)->posts()
se obtiene solo la instancia de la relación.
Al trabajar con App\User::find(1)->posts()->where('points','>',100)->get();
estás agregándole una restricción a la instancia de la relación para luego hacer la consulta SQL contra la base datos.
Puedes revisar también nuestros cursos: Curso básico de Eloquent y Curso avanzado de Eloquent ORM para aprender a trabajar con el ORM de Laravel.
Material relacionado
- La nueva variable $loop en la directiva foreach de Blade
- Fluent y Eloquent en Laravel 5 – Parte 1
- Fluent y Eloquent en Laravel 5 – Parte 2
- Uso de colecciones en Laravel
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Creación de comandos a través de funciones anónimas o closures en Laravel 5.3 Lección siguiente Uso avanzado del método where en las Colecciones en Laravel 5.3