创建新模型时,我尝试使用optional()
帮助程序在设置值时指定值。但是,如果在此上下文中未设置user
对象,则会收到此错误:"Undefined property: stdClass::$user"
$this->events()->create([
'category_a' => optional($event)->categoryA,
'category_b' => optional($event)->categoryB,
'user' => optional($event->user)->accountId,
]);
为了澄清,始终设置$event
,但它可以包含不同的值。有时会设置category_a
,有时会设置category_b
。可选的助手似乎在这里做的伎俩。但是,当对象比一个级别更深时,它会抛出一个错误。
那么如何使用比一个级别的对象更正确地使用optional
助手呢?
答案 0 :(得分:1)
while (fgets(line, sizeof(line), fp)){
sscanf(line,"%d\t%[^\t]\t%d\t%f",&pno,&pname,&qty,&uprice);
Writen(sockfd,line,strlen(line));
id[x]=pno;
strncpy(name[x], pname, 50);
qrty[x]=qty;
price[x]=uprice;
x++;
}
助手通常用于避免因访问null对象上的propeties或方法而产生的错误,例如:
致命错误:在null
上调用成员函数foo()
由documentation指定:
可选函数接受任何参数,并允许您访问该对象的属性或调用方法。如果给定对象为null,则属性和方法将返回null而不是导致错误。
一个实际的例子
在您的代码中,您正在从001 Coffee maker 10 3000.00
002 Pressure cooker 4 7000.00
003 Blender 10 2500.00
004 Pillow 10 300.00
005 Camera 5 25000.00
006 Washer 5 25000.00
007 Headphone 3 5000.00
008 Mattresses 5 6000.00
009 Heater 3 1000.00
010 Cookware 2 10000.00
模型中访问名为optional()
的关系:
address
如果您的user
有空,并且您尝试检查return $user->address->street;
,则会返回致命错误,这里是使用帮助程序$user->address
发挥作用的地方你可以明确地说street
可能为空,所以如果是这样的话,不要给我显示错误:
optional()
通过这样做,您将获得$user->address
而不是致命错误。
在我看来,这使得代码更具可读性,等价可能是return optional($user->address)->street;
,但正如您所看到的更为冗长。
在你的情况下,正如评论所说,一个选项是嵌套null
助手,但如果你有多个级别,那么这不是maintanable。我建议你创建一个内部链接帮助器的函数,这样你的语法就像$user->address ? $user->address->street : null
。
希望这会对你有所帮助。