Laravel中的用户关注/订阅关系模型

时间:2015-07-13 19:39:55

标签: php laravel orm eloquent laravel-5

我正在尝试为我的应用程序创建一个youtube样式的订阅模型。到目前为止,我已经获得了少量成功,因为您可以关注其他用户,并且可以存储谁在数据库中关注谁。但是,我无法检索当前用户关注的人员列表。

数据库:

users表(id,first_name,last_name,email,password,token,timestamps)

订阅表(id,user_id,subscriber_id,timestamps)

用户模型:

public function subscriptions()
{
 return $this->belongsToMany('App\User', 'subscriptions', 'user_id',     
 'subscriber_id')->withTimestamps();
}

public function subscribers()
{
return $this->belongsToMany('App\User', 'subscriptions', 'subscriber_id', 
'user_id')->withTimestamps();
}

我正在使用此代码检索所有当前用户订阅(也就是他们所关注的人)

 $subscriber = Auth::user()->id;


 $user = User::find($subscriber);


 $userids = $user->subscriptions->lists('user_id');

 return $userids;

现在,此代码当前返回null值。在进一步调查时,这是有道理的,因为正在运行的查询不正确

SQL查询:

select `user_id` from `users` inner join `subscriptions` on `users`.`id` = `subscriptions`.`subscriber_id` where `subscriptions`.`user_id` = 14

我目前的设置是试图寻找错误的东西。

如果用户1跟随用户2,3和4,则我的代码应返回2,3和4。

有人可以帮助纠正我的关系设置或我正在运行的代码吗?它应该根据当前用户subscriber_ID在订阅表中查找user_id。

2 个答案:

答案 0 :(得分:2)

Laravel 5.3 Eloquent Relationships

如果您检查多对多关系部分末尾的代码,您将看到这行代码。

return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');

在这里,我们将'role_user'作为透视(关系)表, 'user_id' ,这是外国关键表中的键用户模型中的主键'role_id'是关系表中的外键和角色模型中的主键。

所以当你尝试这样做时:

public function subscriptions()
{
 return $this->belongsToMany('App\User', 'subscriptions', 'user_id',     
 'subscriber_id')->withTimestamps();
}

您实际上在关系表中将 'subscriber_id' 作为外键,而主键 订阅者。由于该函数正在尝试获取订阅,因此到达订阅者ID将无法完成工作。这就是为什么当你改变它们时它们起作用了。

结果应如下所示:

public function subscribers()
{
 return $this->belongsToMany('App\User', 'subscriptions', 'user_id',     
 'subscriber_id')->withTimestamps();
}

public function subscriptions()
{
return $this->belongsToMany('App\User', 'subscriptions', 'subscriber_id', 
'user_id')->withTimestamps();
}

答案 1 :(得分:1)

所以出于纯粹的机会,我交换了订阅者()和订阅()关系,现在它正在返回正确的数据。我不明白为什么,但它肯定会返回我期待的ID。

如果有明确解决方案的人回答,我会暂时保持这个问题。