我正在尝试为我的应用程序创建一个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。
答案 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。
如果有明确解决方案的人回答,我会暂时保持这个问题。