繁体   English   中英

Laravel关系-hasMany,hasOne

[英]Laravel relationships - hasMany, hasOne

我有两个模型,一个订单模型和一个地址模型。 订单表中的每一行都有一个地址ID,该地址ID与地址表中的一行相关。

在订单模型中...

public function address()
{
    return $this->hasOne(OrderAddress::class);
}

在地址模型中...

public function order()
    {
        return $this->hasMany(Order::class);
    }

但是,我想从订单模型访问地址

$order->address

这显示错误,因为我在地址表中没有任何order_id字段。 最终,我希望可以检查表中的地址是否已经存在(例如,来自同一客户的重复订单),然后可以在多个订单中重复使用同一行。

因此,总而言之,一个订单只能有一个地址,但是一个地址可以有多个订单。 我已经这样设置了我的模型(我认为),但是抛出了以下错误:

Column not found: 1054 Unknown column 'order_addresses.order_id' in 'where clause'

出现该错误的原因是,您在表中没有设置外键。如果您使用的是与默认命名约定不同的外键,则必须指定外键的名称。 如果您不使用预期的“ id”,甚至可以指定主键。

public function order()
    {
        return $this->hasMany('App\Order', 'foreign_key', 'local_key');
    }

public function address()
{
    return $this->hasOne('App\OrderAddress', 'foreign_key');
}

Laravel假定您在以下情况下使用数据库命名最佳实践:

  • 表格= table_name
  • 数据透视表= tablea_tableb
  • 主键= id
  • 外键= referencedtable_id

如果您不遵循该标准,那么Eloquent足够灵活,可以为您提供一个参数来更改它。

在这里阅读更多关于雄辩关系的信息

这似乎是一个相当普遍的混淆,但是hasMany的反函数是belongsTo

您需要的是:

public function address()
{
    return $this->belongsTo(OrderAddress::class);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM