lunes, 9 de julio de 2018

Laravel Eloquent Model declarar una llave primaria que no es de tipo entero

Laravel, por defecto, asume que la llave primaria es de tipo entero.  Si tienes que usar una tabla cuya llave primaria no es del tipo entero (integer), debes hacérselo saber a Eloquent, ya que si no, los valores de la llave primaria aparecerán en tu colección como cero 0.

En tu modelo debes declarar lo siguiente al principio. Por ejemplo, si tenemos User.php con llave primaria que no sea de tipo entero y si además tal columna no se llama 'id':
    protected $table = 'autores'; //nombre de la tabla
    protected $primaryKey = 'DNI'; //Nombre de la llave primaria
    public $incrementing = false; //Con esto le decimos a Laravel Eloquent de que la llave primaria no es del tipo entero.
Saludos.

Laravel Diferencia entre hasOne() y belongsTo() en una relación de 1 a 1

La verdad yo me hago bolas para saber qué columnas van en la sintaxis y en qué modelos van.

He encontrado la siguiente forma de saberlo.

Primero hay que fijarse cuál de las dos tablas tiene la columna relacional, es decir, 'relacion_id'.  Quien tenga tal columna, en el modelo correspondiente va la función belongsTo(). Y en la otra, entonces, irá la de hasOne().

Ya está.

Explicación más a detalle:

Si tenemos la tabla `empleados` a la que queremos relacionar, digamos la nómina, tendremos una tabla `nominas`. Es una relación uno a uno porque a un usuario se le paga via nómina y es de manera individual. Ni modo que un salario se reparta entre más de un empleado. Ahi, dependiendo de cómo lo estructuremos (puede ser de una u otra manera), podemos poner la columna relacional dentro de la tabla `empleados` así: 'nomina_id'.

Ahora nos preguntamos ¿quién tiene la columna relacional? la respuesta es la tabla 'empleados'. Entonces en el modelo Empleado.php se coloca la función belongsTo().

Empleado.php
public function nomina()
    {
        return $this->belongsTo(Nomina::class,'nomina_id','id'); //ID = el identificador de la tabla de `nominas`
    }
Nomina.php
Y en la tabla `nominas` se pone la función hasOne();
    public function empleado()
    {
        return $this->hasOne(Empleado::class,'nomina_id','id');//ID = el identificador de la tabla de `nominas`
    }

* Nótese que el 2do y 3er argumento de hasOne() y belongsTo() ¡tienen los mismos valores!

Saludos.

Referencias: https://laracasts.com/discuss/channels/eloquent/belongsto-and-hasone
 

Tags