为啥我的 Laravel 一对一关系没有按预期工作?

Posted

技术标签:

【中文标题】为啥我的 Laravel 一对一关系没有按预期工作?【英文标题】:Why isn't my Laravel one-to-one relationship working as expected?为什么我的 Laravel 一对一关系没有按预期工作? 【发布时间】:2016-08-06 13:57:21 【问题描述】:

我有两个模型,DeliveryShipment

Deliveries 可以与 Shipment 有两个不同的一对一关系:OutboundShipmentInboundShipment

我是这样定义这些关系的:

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_shipmentinbound_shipment作为模型的属性。

但是,当我尝试将交货包含在货件中时,这不起作用。如果我打电话给$shipments = Shipment::with('delivery')->get();,我会收到所有货物,两个字段为空:delivery_iddelivery

知道我在这里做错了什么吗?我假设至少,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 一对一关系没有按预期工作?的主要内容,如果未能解决你的问题,请参考以下文章

排除某些对象的一对多关系上的 NSFetchRequest 无法按预期工作

为啥我的 Laravel 模型关系没有保存?

为啥我的替换没有按预期工作[重复]

为啥我的查询没有按预期工作?

为啥我的 javascript 代码没有按预期工作

为啥我的依赖属性绑定没有按预期工作?