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
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 deselect * from "units" where "units"."item_id" = $1 and "units"."item_id" is not null
, puedes actualizar el métodounit()
del modeloItem
para especificar la columna de clave externa como segundo argumento de esta manera:Esto le indica a Laravel que utilice la columna
unit_id
en la tablaitems
como la clave externa para enlazar el modeloUnit
. Con este cambio, la consulta SQL debería generarse correctamente.