es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Relación Eloquent de Laravel para tabla de búsqueda

Tengo un modelo llamado Item y un modelo llamado Unit. Estoy intentando crear un sistema de inventario.

La tabla para el modelo Item es:

items
id
name
description
location_id
count
unit_id
type_id
provider_id

Y para el modelo Unit:

Units
id
name
description

En el modelo Item tengo esta función pública:

class Item extends Model
{
    use HasFactory;

    public function unit() {
        return $this->belongsTo('Unit', 'id');
    }
}

Y en el modelo Unit:

class Unit extends Model
{
    use HasFactory;

    protected $table = 'units';

    public function items(): \Illuminate\Database\Eloquent\Relations\HasMany
    {
        return $this->hasMany('Item', 'id');
    }
}

Y al revisar los registros de la base de datos, encuentro que el SQL de Laravel es:

select * from "units" where "units"."item_id" = $1 and "units"."item_id" is not null

Cuando hago esto en el tinker:

$item = App\Models\Stock\Item::find(1);
$item->unit

¿Cómo puedo hacer esto y decirle a Laravel que envíe un SQL como este?

select * from "units" where "units"."id" = $1 and "units"."id" is not null

Donde el valor de id será el del item?

Gracias de antemano.

Martín

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el problema y hacer que Laravel envíe una consulta SQL como select * from "units" where "units"."id" = $1 and "units"."id" is not null en lugar de select * from "units" where "units"."item_id" = $1 and "units"."item_id" is not null, puedes actualizar el método unit() del modelo Item para especificar la columna de clave externa como segundo argumento de esta manera:

    public function unit() {
        return $this->belongsTo(Unit::class, 'unit_id');
    }
    

    Esto le indica a Laravel que utilice la columna unit_id en la tabla items como la clave externa para enlazar el modelo Unit. Con este cambio, la consulta SQL debería generarse correctamente.

Comments are closed.