【发布时间】: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 吗?入境?两者都有?
标签: php laravel foreign-keys relationship one-to-one