为啥我的 Laravel 一对一关系没有按预期工作?
Posted
技术标签:
【中文标题】为啥我的 Laravel 一对一关系没有按预期工作?【英文标题】:Why isn't my Laravel one-to-one relationship working as expected?为什么我的 Laravel 一对一关系没有按预期工作? 【发布时间】:2016-08-06 13:57:21 【问题描述】:我有两个模型,Delivery
和 Shipment
。
Deliveries
可以与 Shipment
有两个不同的一对一关系:OutboundShipment
和 InboundShipment
。
我是这样定义这些关系的:
class Delivery extends Model
public function outboundShipment()
return $this->hasOne('App\Shipment', 'delivery_id', 'outbound_shipment_id');
public function inboundShipment()
return $this->hasOne('App\Shipment', 'delivery_id', 'inbound_shipment_id');
public function addRelatedShipments()
$newOutboundShipment = new Shipment();
$newOutboundShipment->status = 'Delivery Outbound';
$newOutboundShipment->save();
$this->outboundShipment()->save($newOutboundShipment);
$newInboundShipment = new Shipment();
$newInboundShipment->status = 'Inbound';
$newInboundShipment->save();
$this->inboundShipment()->save($newInboundShipment);
class Shipment extends Model
public function delivery()
return $this->hasOne('App\Delivery');
创建Delivery
对象并保存后,我调用addRelatedShipments()
。
一方面,这很好用——如果我打电话给$deliveries = Delivery::with('outboundShipment')->with('inboundShipment')->get();
,我会得到交货清单,每个交货都有outbound_shipment
和inbound_shipment
作为模型的属性。
但是,当我尝试将交货包含在货件中时,这不起作用。如果我打电话给$shipments = Shipment::with('delivery')->get();
,我会收到所有货物,两个字段为空:delivery_id
和delivery
。
知道我在这里做错了什么吗?我假设至少,delivery_id
字段不应该为空。如前所述,在调用addRelatedShipments()
之前,我确实在Delivery
模型上调用save()
。
【问题讨论】:
我想你必须在 Shipment Model 上定义 hasOne 关系的两倍,就像在 Delivery 上所做的那样。 嗯,我认为这可能是解决方案,但这不会违背我的关系逻辑吗?每个 Shipment 只有一个 Delivery,我希望它使用相同的字段delivery_id
。
没关系,但是您有两个不同的交付时引用 Shipment 的“密钥”。它(装运)需要知道与哪一个合作。 github.com/laravel/framework/blob/5.2/src/Illuminate/Database/…
但是 Delivery 上的两个不同的“键”最终成为本地键,所以 Delivery 模型可以同时具有 'outbound_shipment_id' 和 'inbound_shipment_id' ......我肯定很困惑。第二个参数应该是外键(根据 Laravel 文档),这就是我将其设置为“delivery_id”的原因,以便 Shipment 模型使用“delivery_id”来指代交付......或者我错过了什么明显在这里?
从运输模型看交货。它有两种链接到交付的方式:入站和出站。查询时,Shipment 需要知道在哪里可以找到 Deliveries,是 outbound 吗?入境?两者都有?
【参考方案1】:
因为您的 Shipment 包含 delivery_id
,它必须将与 Delivery 模型的关系定义为 BelongsTo。将您的关系更新为:
class Shipment extends Model
public function delivery()
return $this->belongsTo('App\Delivery');
【讨论】:
我的错。我最初有这个并得到了相同的结果。我换到hasOne
尝试不同的东西。以上是关于为啥我的 Laravel 一对一关系没有按预期工作?的主要内容,如果未能解决你的问题,请参考以下文章