SRP

Cómo generar modelos de Laravel desde una base de datos existente

April 23, 2021

Instalación

En un proyecto existente de Laravel agreguemos el paquete reliese/laravel como una dependencia solo para nuestro entorno de desarrollo

composer require reliese/laravel --dev

Ahora hay que publicar el archivo de configuraciones

php artisan vendor:publish --tag=reliese-models

Uso

¡Ahora sí!

Espera un momento, primero lo primero 😜: Hay que configurar nuestra base de datos.

Ahora sí 🎉

php artisan code:models

Ya tengo mis modelos

<?php

/**
 * Created by Reliese Model.
 */

namespace App\Models;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;

/**
 * Class User
 * 
 * @property int $id
 * @property string $name
 * @property string $email
 * @property Carbon|null $email_verified_at
 * @property string $password
 * @property string|null $remember_token
 * @property Carbon|null $created_at
 * @property Carbon|null $updated_at
 *
 * @package App\Models
 */
class User extends Model
{
	protected $table = 'users';

	protected $dates = [
		'email_verified_at'
	];

	protected $hidden = [
		'password',
		'remember_token'
	];

	protected $fillable = [
		'name',
		'email',
		'email_verified_at',
		'password',
		'remember_token'
	];
}

Incluyen

  • Los property type hints que nos ayudan con el autocompletado
  • El nombre de la tabla (table)
  • La fechas que serán convertidas a instancias de Carbon (dates)
  • Los campos protegidos (hidden) que no se mostrarán al convertir el model en array
  • Los campos asignables (fillable)
$user = new \App\Models\User();

$user->created_at->diffForHumans();

¿Y si agrego nuevas tablas?

php artisan make:migration create_posts_table

Y agrego una relación

Schema::create('posts', function (Blueprint $table) {
		$table->id();
    $table->foreignIdFor(\App\Models\User::class)
        ->constrained()
        ->onDelete('cascade');
    $table->string('title');
    $table->text('body');
    $table->boolean('visible');
    $table->dateTime('publication_date');
    $table->softDeletes(); // Estamos habilitado los soft deletes 👀
    $table->timestamps();
});

Creemos la tabla

php artisan migrate

Volvamos a generar nuestros modelos

php artisan code:models

Vemos el modelo generado

<?php

/**
 * Created by Reliese Model.
 */

namespace App\Models;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

/**
 * Class Post
 * 
 * @property int $id
 * @property int $user_id
 * @property string $title
 * @property string $body
 * @property bool $visible
 * @property Carbon $publication_date
 * @property string|null $deleted_at
 * @property Carbon|null $created_at
 * @property Carbon|null $updated_at
 * 
 * @property User $user
 *
 * @package App\Models
 */
class Post extends Model
{
	use SoftDeletes;
	protected $table = 'posts';

	protected $casts = [
		'user_id' => 'int',
		'visible' => 'bool'
	];

	protected $dates = [
		'publication_date'
	];

	protected $fillable = [
		'user_id',
		'title',
		'body',
		'visible',
		'publication_date'
	];

	public function user()
	{
		return $this->belongsTo(User::class);
	}
}

Se agregó el ¡trait de SoftDeletes! a la tabla posts 🥳

Y podemos ver que tenemos ¡la lista de castings!

  • bool
  • int

El modelo User también fue actualizado con su relación hasMany y un nuevo property type hint que nos ayudará con el autocompletado para la relación con los posts

<?php

/**
 * Created by Reliese Model.
 */

namespace App\Models;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;

/**
 * Class User
 * 
 * @property int $id
 * @property string $name
 * @property string $email
 * @property Carbon|null $email_verified_at
 * @property string $password
 * @property string|null $remember_token
 * @property Carbon|null $created_at
 * @property Carbon|null $updated_at
 * 
 * @property Collection|Post[] $posts
 *
 * @package App\Models
 */
class User extends Model
{
	protected $table = 'users';

	protected $dates = [
		'email_verified_at'
	];

	protected $hidden = [
		'password',
		'remember_token'
	];

	protected $fillable = [
		'name',
		'email',
		'email_verified_at',
		'password',
		'remember_token'
	];

	public function posts()
	{
		return $this->hasMany(Post::class);
	}
}

Ahora el User tiene la relación con los posts ¡y gracias los type hints tenemos autocompletado!

$user = new User();
        
foreach ($user->posts as $post) {
		// El IDE nos autocompletará después de la flecha
    $post->
}

¿Y si quiero agregar métodos y cambiar algo en mis modelos?

Para esto podemos habilitar los base_models en el archivo de configuración 🚀