如何知道我的关系何时返回对象以及何时返回数组?

时间:2019-03-24 16:56:51

标签: php laravel laravel-5 eloquent

我的模型中没有几个关系回复:

/** Reply.php */

public function thread()
{

    return $this->belongsTo(Thread::class);
}

public function user()
{
    return $this->belongsTo(User::class);
}

我的回复表中有user_idthread_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();
}

3 个答案:

答案 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在使用前不为空。

让我知道它是否对您有帮助:)