试图获得非对象的属性

时间:2014-10-14 10:35:30

标签: laravel eloquent

我需要一点澄清。

此错误消息“尝试获取非对象的属性”到使用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发布内容来提取团队名称。

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

3 个答案:

答案 0 :(得分:0)

在第

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

squadra_post()方法

返回一个对象集合(我猜的帖子),而不是一个对象,因为你的关系的性质(1到多),而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
  }
}

修改

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

首先,你的关系不会以这种方式运作,因为 Laravel 4+希望关系名称为camelCased ,然后才能使用dynamic properties

因此,将其重命名为squadraPost(),并将其称为$post->squadraPost,如果是hasMany,则无论是否存在任何相关模型或Collection,您都会在此处获得null

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

最后,但并非最不重要:您可能会从find()方法获得$post = Post::find(..) ,因此请先确认:

null

返回您的模型,而不是if ($post) $post->squadraPost; 。只有这样才能称之为关系:

{{1}}