Laravel optional()如何工作?

时间:2018-04-20 08:59:57

标签: php laravel

创建新模型时,我尝试使用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助手呢?

1 个答案:

答案 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

希望这会对你有所帮助。