我的模型中没有几个关系回复:
/** Reply.php */
public function thread()
{
return $this->belongsTo(Thread::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
我的回复表中有user_id
和thread_id
然后我尝试获取用户名,就像这样:
$reply->user->name
它有效。
但是当我尝试获取线程title
时:
$reply->thread->title
我遇到错误:
试图获取非对象的属性
title
如果只需要获取标题,我知道的方法是:
$reply->thread['title']
我使用的方法之间有什么区别?为什么在一种情况下,我将用户作为对象,而在另一种情况下,将线程作为数组?
我的Reply
模型关系:
public function user()
{
return $this->belongsTo(User::class);
}
public function favorites()
{
return $this->morphMany(Favorite::class, 'favorited');
}
public function thread()
{
return $this->belongsTo(Thread::class);
}
我的线程模型关系:
public function replies()
{
return $this->hasMany(Reply::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
public function category()
{
return $this->belongsTo(Category::class);
}
与我的User
模型关系:
public function threads()
{
return $this->hasMany(Thread::class)->latest();
}
public function replies()
{
return $this->hasMany(Reply::class)->latest();
}
答案 0 :(得分:2)
Model
类实现了Arrayable
接口,这意味着您也可以像访问array
一样访问属性,这就是为什么要这样做的原因:
$reply->thread['title'];
使用BelongsTo
关系时,如果未设置此关系,则期望返回对象(模型的实例)或null
,这就是为什么可以使用“魔术方法”来访问这样的属性:
$reply->thread // an object
$reply->thread->title // getting attributes using magic methods
但是,如果没有建立关系,会发生什么呢?好,该关系将返回null
,因此当您执行此操作时:
$reply->thread->title
它将抛出一个错误:
试图获取非对象的产权
因为您正在尝试访问title
的{{1}}属性。
这是-我认为-错误所在。使用最新版本的Laravel(到目前为止:Laravel null
),主键类型已从5.8
更改为integers
,并且适用于所有表:
bigIntegers()
因此,您的外键也应该是大整数,请尝试以下操作:
Schema::create('replies', function (Blueprint $table)
{
$table->bigIncrements('id'); // <---- equivalent to bigInteger
$table->integer('user_id')->unsigned;
$table->integer('thread_id')->unsigned;
$table->text('body');
$table->timestamps();
});
检查this article与此问题有关。
答案 1 :(得分:2)
制作时
一对一
关系,则关系将返回object
制作
一对多
关系将返回array of objects
答案 2 :(得分:1)
我认为导致此错误的唯一原因是从关系中返回null
。在这种情况下
$reply->thread['title']
不起作用,您能检查一下吗?
如果$reply->thread['title']
有效,请查看dd($reply->thread);
的输出。
如果它不起作用并且错误的原因确实是null
返回,则只需检查一下
$reply->thread
在使用前不为空。
让我知道它是否对您有帮助:)