Convenciones de Eloquent en Laravel

2020-05-01 Laravel
Tags   Laravel 6x

Al iniciar con laravel es muy fácil olvidar el comportamiento por defecto con relación a Eloquent. En este post enumararemos algunas normas que laravel da por hecho que facilitarán tu vida. Si estás aquí y no sabes qué es Eloquent te recomandamos leer nuestro post Qué es Eloquent en Laravel.

Convenciones de modelos

( 1 ) El comando make:model crea un archivo con el nombre del modelo en la carpeta app. Todos los modelos extienden de la clase Illuminate\Database\Eloquent\Model. Observa el archivo App/Empleado.php creado con artisan.

php artisan make:model Empleado
namespace App;

use Illuminate\Database\Eloquent\Model;

class Empleado extends Model
{
    //
}

( 2 ) Si creas un modelo con nombre en singular, de manera predeterminada Eloquent asumirá que está relacionado con una tabla con su mismo nombre en plural. Para cambiar este comportamiento basta con especificar directamente en la clase modelo el nombre de la tabla.

namespace App;

use Illuminate\Database\Eloquent\Model;

class Empleado extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'erp_empleados';
}

( 3 ) Eloquent asume que el nombre de la llave primaria de una tabla es siempre id y que es un entero incremental. Una vez más para cambiar este comportamiento basta entrar al código del modelo y hacer los cambios respectivos.

namespace App;

use Illuminate\Database\Eloquent\Model;

class Empleado extends Model
{
    /**
     * The primary key associated with the table.
     *
     * @var string
     */
    protected $primaryKey = 'empleado_id';

    /**
     * Indicates if the IDs are auto-incrementing.
     *
     * @var bool
     */
    public $incrementing = false;

    /**
     * The "type" of the auto-incrementing ID.
     *
     * @var string
     */
    protected $keyType = 'string';
}

Utiliza el $keyType solamente si el tipo de dato de la columna de llave primaria no es un entero.

( 4 ) Eloquent utiliza por defecto snake case para el nombre de las tablas. Lo cuál significa que nombres compuestos serán separados por el caractér _ (underscore).

Relaciones

Las relaciones se definen con hasOne o hasMany.

return $this->hasOne('class', 'foreign_key', 'local_key');

( 5 ) Eloquent determina la llave foránea de una relación basado en el nombre del modelo seguido del nombre de la llava primera de la clase en donde se define la relación.

namespace App;

use Illuminate\Database\Eloquent\Model;

class File extends Model
{
    protected $primaryKey = 'idx';

    public function fileDownloads()
    {
        return $this->hasOne(FileDownload::class);
    }
}

Esta relación buscará la columna file_idx en la tabla del modelo FileDownload.

( 6 ) Eloquent determina la llave local de una relación basado en la primary key del modelo.

Siguiendo el ejemplo anterior la relación buscará la llave local idx en la tabla del modelo File.

Relaciones Inversas

Las relaciones inversas se definen con belongsTo.

$this->belongsTo('class', 'foreign_key', 'local_key');

( 7 ) Eloquent determina la llave foránea de una relación inversa basado en el nombre del método y la primary key de la tabla relacionada.

namespace App;

use Illuminate\Database\Eloquent\Model;

class File extends Model
{
    protected $primaryKey = 'fileid';
}
namespace App;

use Illuminate\Database\Eloquent\Model;

class FileDownload extends Model
{
    public function filex()
    {
        return $this->belongsTo(File::class);
    }
}

Esta relación buscará la columna filex_fileid en la tabla del modelo FileDownload

( 8 ) Eloquent determina la llave local de una relación inversa basado en la primary key del modelo relacionado. 

Siguiendo el ejemplo anterior la relación buscará la llave local fileid en la tabla del modelo File.

Si te ha gustado este artículo puedes invitarme a tomar una taza de café

Acerca de Darío Rivera

Author

Ingeniero de desarrollo en PlacetoPay , Medellín. Darío ha trabajado por más de 6 años en lenguajes de programación web especialmente en PHP. Creador del microframework DronePHP basado en Zend y Laravel.

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.