试图获取非对象的属性
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->squadraPost
,如果是hasMany
,不管有没有相关型号,你都会在这里得到一个Collection
。
接下来是检查相关模型是否存在 - 请在此处阅读答案:Laravel check if related model exists
最后,但同样重要的是:您可能会从 find()
方法获得 null
,所以首先要确保:
$post = Post::find(..)
返回您的模型,而不是 null
。只有这样你才能调用它的关系:
if ($post) $post->squadraPost;
【讨论】:
以上是关于试图获取非对象的属性的主要内容,如果未能解决你的问题,请参考以下文章