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,型号
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
。