Laravel 获取非对象的属性

Posted

技术标签:

【中文标题】Laravel 获取非对象的属性【英文标题】:Laravel get property of non object 【发布时间】:2016-02-12 20:43:49 【问题描述】:

当我尝试确定一个对象是否为空时,它会告诉我:

试图获取非对象的属性

我是这样做的:

 $lastTicket = Auth::user()->ticket->last()->ticketid;
    if($lastTicket->isEmpty())
    
        $lastTicket = 0;
    

显然 Auth::user()->ticket->last();还没有记录。我该怎么做?我正在与 Laravel 合作。

【问题讨论】:

根据您上面的内容,ticketid 是属性而不是对象。因此,您不能使用对象表示法或在$lastTicket 上调用诸如->isEmpty(); 之类的方法。 【参考方案1】:

正确答案是:

$lastTicket = !Auth::user()->ticket->last() ? Auth::user()->ticket->last()->ticketid+1 : 0;

因为如果它为空,它将默认返回 0。

【讨论】:

【参考方案2】:

在获取属性之前,您需要检查集合不为空:

    if(Auth::user()->ticket->last()->isEmpty())
    
       $lastTicket = 0;
    
    else
    
        $lastTicket = Auth::user()->ticket->last()->lastId;
    

简而言之:

$lastTicket = !Auth::user()->ticket->last()->isEmpty() ? $lastTicket = Auth::user()->ticket->last()->lastId : 0;

【讨论】:

感谢您的回复,但当我这样做时,它告诉我:调用未定义的方法 Illuminate\Database\Query\Builder::isEmpty() 如果 last() 关系是 OneToOne 这个构造必须有效: $lastTicket = !empty(Auth::user()->ticket->last()) ? $lastTicket = Auth::user()->ticket->last()->lastId : 0; 当我尝试时: $lastTicket = Auth::user()->ticket->last()->ticketid; if($lastTicket->isEmpty()) $lastTicket=1; var_dump($lastTicket); 抛出异常:在非对象上调用成员函数isEmpty() 我发现你只能在收集母猪上使用 isEmpty() 这不起作用。【参考方案3】:

首先看看here 是否可以解决您的问题。无论如何,如果您尝试加载关系,您应该查看official documentation:

动态属性

Eloquent 允许您通过动态属性访问您的关系。 Eloquent 会自动为你加载关系,甚至可以知道是调用 get(对于一对多关系)还是 first(对于一对一关系)方法。然后可以通过与关系同名的动态属性访问它。例如,使用以下型号 $phone:

class Phone extends Eloquent 

   public function user()
   
       return $this->belongsTo('User');
   



$phone = Phone::find(1);

而不是像这样回显用户的电子邮件:

echo $phone->user()->first()->email;

可以简写为:

echo $phone->user->email;

【讨论】:

以上是关于Laravel 获取非对象的属性的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 获取非对象的属性

Laravel 5.6 - “试图获取非对象的属性”

试图在 Laravel 4 中获取非对象的属性

Laravel 5.6 试图获取非对象的属性

试图在 laravel 5.5 中获取非对象的属性

Laravel 问题-“试图获取非对象的属性”