【问题标题】: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

【问题讨论】:

    标签: laravel eloquent


    【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        相关资源
        最近更新 更多