可以为空的外部的 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 外部表上显示为空

C# 8 中的不可为空的引用类型在运行时可以为空吗?

为啥可以为空的 rowversion 列在语义上等同于 varbinary(8)?

如何创建可以保存状态的不可为空的 LiveData