Laravel Eloquent Relationship Chain

时间:2017-06-26 02:04:37

标签: php mysql laravel eloquent laravel-5.4

我正在构建一个简单的通知系统。 我可以通过Auth::user()->notifications获取登录用户通知,但我的最终目标是获取通知来自的用户信息。

我希望得到

的最终结果
foreach( Auth::user()->notifications AS $n)
{
    echo $n->from->username;
}

目前这会抛出“试图获取非对象属性”错误。

通知表;

id
user_id - notification for this user
from_user_id - notification from this user

user.php的;

public function notifications()
{
    return $this->hasMany('App\Notification', 'user_id', 'id')->orderBy('notifications.id','desc');
}

public function notificationsUnread()
{
    return $this->hasMany('App\Notification', 'user_id', 'id')->where('notifications.seen',null)->orderBy('notifications.id','desc');
}

Notification.php;

public function to()
{
    return $this->belongsTo('App\User', 'user_id');
}

public function from()
{
    return $this->belongsTo('App\User', 'from_user_id');
}

1 个答案:

答案 0 :(得分:0)

首先,您需要在表通知中设置外键;然后用户可以有一个通知。和许多在同一时间。一份通知。属于一个用户和许多通知。可以属于一个用户。所以在Notification模型中你设置了关系belongsTo就像这样;

外键:

$table->foreign('from')->refrences('id')->on('users')->onDelete('cascade');

那么关系:

public function users()
{
   return $this->belongsTo('App\User');
}

然后从控制器中你可以得到这样的用户信息;

$userName= Notification::users()->name;

在你的情况下,你指的是错误的返回你将只得到关系类型而不是数据对象,因为你像非方法一样调用from。你应该这样做:

foreach( Auth::user()->notifications AS $n)
{
    echo $n->from()->username;
}