试图获取非对象的属性

Posted

技术标签:

【中文标题】试图获取非对象的属性【英文标题】:Trying to get property of non-object 【发布时间】:2014-12-09 02:53:19 【问题描述】:

我需要澄清一下。

此错误消息“尝试获取非对象的属性”是指使用 Eloquent 时所指的内容?我要疯了。我正在使用一个函数:

public function squadra_post()

return $this->hasMany('Squadra','id_squadra');

这是扩展 Eloquent Post 的模型。通话时间:

<?php $squadra = Post::find($roles->id_squadra)->squadra_post; ?>

给出了我之前提到的错误。

编辑

他是带有他们方法的班级帖子。出问题的是“squadra_post()” 我需要通过id_squadra post content in table来提取团队名称。

class Post extends Eloquent implements UserInterface, RemindableInterface 

    protected $table = 'post';
    protected $primaryKey = 'id_post';
    public $timestamps = false;

    public function commenti() 
    
        return $this->hasMany('Commento','id_post');
    

    public function apprezzamenti() 
    
        return $this->hasMany('Apprezzamenti','id_post');
       

    public function squadra_post() 
    
        return $this->hasMany('Squadra','id_squadra');
     

这是“squadra”类的代码

class Squadra extends Eloquent implements UserInterface, RemindableInterface 

    protected $table = 'squadra';
    protected $primaryKey = 'id_squadra';
    public $timestamps = false;

最后,这是给我带来问题的代码。这就是给我的错误:尝试获取非对象的属性

@foreach($post['post'] as $roles)
    @if($roles->id_squadra != 0)
        $squadra = Post::find($roles->id_squadra)->squadra_post;
        @foreach($squadra as $squadra_post)
            $squadra->nome 
        @endforeach
    @endif
@endforeach

【问题讨论】:

【参考方案1】:

当您厌倦了尝试查找特定帖子时,它找不到它,因此它会抛出一个异常,说“尝试获取非对象的属性”。如果它找到了帖子,它会返回squadra_post,并且它会被存储在变量中。

但是相反,它找不到那个特定的并且无法用它构造一个对象,因此它找不到那个特定的属性名称squadra_post。因此出现错误“尝试获取非对象的属性”。

您可以通过将代码放入 try and catch 块中来处理此异常。

【讨论】:

【参考方案2】:

在一行

$squadra = Post::find($roles->id_squadra)->squadra_post;

squadra_post() 方法

返回对象集合(我猜是帖子)而不是对象,因为您的关系的性质(一对多),而Post::find() 返回对象。我认为这是发生错误的地方。

试试下面的代码

 $squadra = Post::find($roles->id_squadra); 

 if ($squadra) 
   echo $squadra->name;

  foreach ($squadra->squadra_post as $post) 
       echo $post->title;
       echo $post->content; //etc
  

编辑

您还必须确保外键是您在squadra_post() 方法中声明的id_squadra

【讨论】:

我已经尝试过了,但我总是遇到同样的错误。我不明白的是,我使用带有“like”和 cmets 的类似代码,这很好。 您确定 $roles->id_squadra 返回的是单个 id 而不是多个? 它给了我这个错误:为 foreach() 提供的参数无效 对不起“试图获取非对象的属性” 如果你用现有的 id 改变 $roles->id_squadra 你会得到同样的错误吗?【参考方案3】:

首先,您的关系不会以这种方式工作,因为 Laravel 4+ 要求关系名称为 camelCased,只有这样您才能使用 dynamic properties。

所以把它重命名为squadraPost(),然后调用$post-&gt;squadraPost,如果是hasMany,不管有没有相关型号,你都会在这里得到一个Collection

接下来是检查相关模型是否存在 - 请在此处阅读答案:Laravel check if related model exists

最后,但同样重要的是:您可能会从 find() 方法获得 null,所以首先要确保:

$post = Post::find(..)

返回您的模型,而不是 null。只有这样你才能调用它的关系:

if ($post) $post->squadraPost;

【讨论】:

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

Blade - 试图获取非对象的属性

laravel 试图获取非对象的属性

试图获取非对象的属性“主机名”

试图获取非对象的属性 [laravel 5.2]

试图获取非对象的属性

我该如何解决“试图获取非对象的属性”