Laravel “雄辩的习俗”;属于;多表上的关系

Laravel “雄辩的习俗”;属于;多表上的关系,laravel,eloquent,lumen,eloquent-relationship,Laravel,Eloquent,Lumen,Eloquent Relationship,我有以下数据库结构: 表车辆:id、车辆id、飞机id 表汽车:id,型号 表平面:id,型号 当一条新记录添加到表Vehicles中时,如果它是一辆汽车,汽车id将被设置,而飞机id将保留为空,反之亦然,我知道这是一个糟糕的结构,但它是遗留的,我无法更改它 所以我想在车辆模型中定义一个关系,它可以根据钥匙是空的来检索汽车对象或平面对象,汽车id或平面id。顺便说一句,我已经定义了两个关系,分别检索汽车对象和平面对象 public function carVehicle() { re

我有以下数据库结构:

  • 车辆:id、车辆id、飞机id
  • 汽车:id,型号
  • 平面:id,型号
当一条新记录添加到表Vehicles中时,如果它是一辆汽车,汽车id将被设置,而飞机id将保留为空,反之亦然,我知道这是一个糟糕的结构,但它是遗留的,我无法更改它

所以我想在车辆模型中定义一个关系,它可以根据钥匙是空的来检索汽车对象或平面对象,汽车id或平面id。顺便说一句,我已经定义了两个关系,分别检索汽车对象和平面对象

public function carVehicle()
{
    return $this->belongsTo(Car::class, 'car_id');
}

public function planeVehicle()
{
    return $this->belongsTo(Plane::class, 'plane_id');
}

这最好通过
多态关系来处理(有关详细信息,请参阅),但是如果当前模型与结构不匹配,并且您无法更改它,则有办法解决此问题

您可以使用第三种方法,将两者添加到
集合
,并返回
第一个()
一个(因为您说
汽车id
平面id
中的一个将始终为
null
):

Vehicle.php

public function getChildVehicleAttribute(){
  return collect([$this->carVehicle, $this->planeVehicle])
  ->filter(function($record) {
    return $record != null;
  })->first();
}
然后,您可以通过以下查询进行访问:

$vehicle = Vehicle::with(['carVehicle', 'planeVehicle'])->first()->child_vehicle;
// OR
$vehicles = Vehicle::with(['carVehicle', 'planeVehicle'])->get();
foreach($vehicles AS $vehicle){
  $childVehicle = $vehicle->child_vehicle;
  // dd($childVehicle, etc.)
}

with()
子句将加载这两个关系,以便
$this->carVehicle
$this->planeVehicle
不会触发额外的数据库调用,并且在任何
vehicle
实例上调用
child\u vehicle
将返回
Car
Plane
(或者
null
如果两者都没有定义)

那么,您会得到什么错误?您可以通过多态关系来管理
平面id
而不是保存
汽车id