gpt4 book ai didi

php - laravel Eloquent : Eloquent relation needs to return something when there is no data instead of returning null object

转载 作者:行者123 更新时间:2023-12-04 14:22:33 25 4
gpt4 key购买 nike

我的产品模型上有这种关系。

public function productInventory(){
return $this->hasOne('App\Models\Ecommerce\Inventory', 'product_id')->where('is_deleted', 0);
}

有时,我可能没有在我的库存表中插入该特定产品。因此,此关系仍在 View 中发挥作用,但会尝试获取 productInventory->price,这将引发错误,无法获取 null 对象的价格。所以,我现在已经做到了,这只是一件简单的事情。但是计数为1或大于1,因为还有其他产品。那么,对于库存表中没有数据的特定产品,我如何才能只返回 null?

public function productInventory(){
$has_inv = Inventory::where('product_id',$this->id)->where('is_deleted', 0)->count();
if($has_inv < 1){
return null;
}
return $this->hasOne('App\Models\Ecommerce\Inventory', 'product_id')->where('is_deleted', 0);
}

最佳答案

首先,productInventory() 方法必须返回关系。某些记录没有连接的 Inventory 并不重要。此方法必须返回关系,仅此而已……恕我直言,将此返回与数据库的实际状态(“对于此特定产品,没有库存”)混淆是绝对不行的。

所以,如果你的问题出在 View 上,当没有库存时你会得到一个错误,一个更好的解决方案是:

检查 View 是否有可用的对象,然后才检查该对象的价格属性。

你可以用类似...的方式检查它

@if(is_null($productInventory)) 
{{$productInventory->price}}
@endif

顺便说一句,这是代码示例,而不是实际代码。但它让您知道在哪里可以解决这个问题。

因为,你在错误的地方解决了这个问题。恕我直言,关系方法不是地方。

如果你在很多 View 中使用它,你必须优化你的 VIEW 结构(通过使用包含!),而不是带着问题移动到代码中的不同位置。

为您经常使用的 View 代码创建一个包含,包含如下内容:

@include('product_incventory_price_data')

关于 Blade 中的包含

让我们为您的 <head> 使用示例网页中的代码。您可以将其添加到所有单独的网页(您的 View 文件)。让我们看看两种不同的观点 (A en B)

文件:view_a.blade.php

<html>
<head>
<meta charset="utf-8">
<title>{{$page->title}}</title>
<meta name="description" content="{{$page->description}}">
<meta name="keywords" content="{{$page->keywords}}">
</head>
<body>
...stuff for view A
</body>
</html>

文件:view_b.blade.php

<html>
<head>
<meta charset="utf-8">
<title>{{$page->title}}</title>
<meta name="description" content="{{$page->description}}">
<meta name="keywords" content="{{$page->keywords}}">
</head>
<body>
...stuff for view B
</body>
</html>

更好的解决方案:移动所有 <head>代码到不同的文件(在 views/shared 之类的文件夹中)。并将该文件包含在 A 和 B View 中。

共享/head.blade.php

<head>
<meta charset="utf-8">
<title>{{$page->title}}</title>
<meta name="description" content="{{$page->description}}">
<meta name="keywords" content="{{$page->keywords}}">
</head>

查看_a

<html>
@include('shared/head')
<body>
...stuff for view A
</body>
</html>

查看_b

<html>
@include('shared/head')
<body>
...stuff for view B
</body>
</html>

您可以使用各种 View 代码来实现这一点。您的产品价格信息也可以移动到一个地方并在多个其他 View 中使用 @include()...

您通过 Controller 传递给 View 的数据也会传递给包含文件。别担心.... :-)

Laravel documentation about views & sub-views

关于php - laravel Eloquent : Eloquent relation needs to return something when there is no data instead of returning null object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52734660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com