可以为空的外部的 belongsToMany - Laravel 5.8
Posted
技术标签:
【中文标题】可以为空的外部的 belongsToMany - Laravel 5.8【英文标题】:belongsToMany with nullable foreign - Laravel 5.8 【发布时间】:2019-11-15 21:35:45 【问题描述】:在我的 Laravel 项目中,我得到了这个数据库结构:
产品
身份证 姓名订单
身份证 总计Order_Product
Product_id (可为空) Order_Id 详情在我的 Order 模型中,我对 Product 模型进行 belongsToMany 报复:
public function products()
return $this->belongsToMany(Product::class)->withPivot('Details');
问题是当我尝试获取 Order Products Collection 时
$order->products();
我没有得到 product_id 可以为空的行,请问有什么解决方案吗?谢谢。
【问题讨论】:
它应该是这样工作的,你的 product_id 没有引用 products 表中的任何记录。您是否尝试获取所有数据透视表记录? 您好,谢谢您的回复,是的,我想获取所有数据透视表记录,请问您知道怎么做吗? 您想获取所有记录作为 Product 实例吗?或者你不介意把它当作数组? 是的,作为产品实例。 【参考方案1】:Laravel 从 5.5 版本开始支持“空对象模式”,它允许您定义一个默认模型,如果给定关系为空,则该模型将返回。
尝试使用以下代码:
public function products()
return $this->belongsToMany(Product::class)->withDefault()->withPivot('Details');
【讨论】:
错误:调用未定义的方法 Illuminate\Database\Eloquent\Relations\BelongsToMany::withDefault() 还是同样的问题 undefined method 你说得对,对不起,它仅适用于 The belongsTo、hasOne、hasOneThrough 和 morphOne 关系,我的错。 所以对于这种情况没有解决方案,使用 belongsToMany ? 不幸的是,我并不熟悉(因为您实际上想要获得具有空属性的产品实例)。为什么你有一个没有产品中心的订单?我的意思是这些记录的意义或目标是什么?【参考方案2】:很可能,您不会得到“可为空”的产品,因为您有一个关系 Order->Products。当您调用 $order->products() 时,eloquent 会尝试获取通过 product_id 字段连接到您的订单的所有 Product 实体。因此,如果字段为空,则无法获得 Product,因为没有连接。 解决方案之一是:
-
创建另一个实体,例如 OrderLine(Order_Product table);添加 $orderLine->details() 等方法以及与 Product 的关系,如 $orderLine->product()
在 Order 中添加与 OrderLine 的关系 - $order->line() 或 $order->info() 等 -> Order hasMany OrderLine
然后使用 $order->line() 获取订单的详细信息和产品(如果存在)
附言我已经在脑海中编译了它,所以它可能需要一些代码调整。 祝你好运
【讨论】:
@Malek 我的回答对您有帮助吗?我真的很好奇。以上是关于可以为空的外部的 belongsToMany - Laravel 5.8的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.4急切加载belongsToMany关系null绑定
在 athena 上工作时,数据在 redshift 外部表上显示为空