我想将用户ID存储在User
行的列中,因为人们可以“关注”其他人。
因此,如果我是用户,我可以关注多个用户。我希望以超简单格式存储,例如数据库中的[1, 5, 6]
。
Following
列是字符串格式:
$table->string('following');
我试图通过运行以下命令来执行此操作:
$user = Auth::user();
$data = $request->all();
$follow = $data['follow'];
if(!empty($user->following)) {
$user->following = array_merge($user->following, array($follow));
} else {
$user->following = array($follow);
}
然而它低于Parameter mismatch, pattern is a string while replacement is an array
我在另一个系统上完成了同样的方式,也建立在laravel上,并且一切都像魅力一样,所以我根本不明白为什么这不起作用。在该数据库中,如前所述存储数据。
我不想序列化很多,因为这必须很简单,所以我可以做一个
$following = User::whereIn('id', $user->following)->get();
foreach($follwing as $follow) {
...
}
我不认为这是最好的方法,但这是我能用我的技能包裹我的唯一方法。其他建议大多欢迎!
答案 0 :(得分:2)
这不是Laravel存储数据的方式。您应该创建一个新表来存储关注者的数据。
这可以通过在用户表本身之间创建many-to-many
关系来实现。
创建一个followers_following
表,其列为:
id | follower_id | following_id
在User
模型中创建两个关系函数:
public function followers()
{
return $this->belongsToMany('App\User', 'followers_following', 'following_id', 'follower_id');
}
public function following()
{
return $this->belongsToMany('App\User', 'followers_following', 'follower_id', 'following_id');
}
然后您可以将用户查询为:
$user = User::find(1);
$user->followers;
$user->following;
要将数据保存在数据库中,您可以执行以下操作:
$user->following()->attach($follow);
答案 1 :(得分:1)
首先,如果要将数组数据存储到数据库中,最佳列类型可能是$table->json('following')
。加上a cast of that attribute to JSON in your model,这将让Laravel自动保存/检索数组数据。
那就是说,你真的不希望为追随者数据之类的东西做这件事。虽然一些数据库引擎可以索引JSON数据,但其他人不能,并将其存储为字符串更糟糕。 SQL是关系型的,用户 - >关注者关联是关系。
相反,您需要一个单独的表格,例如user_follows
,用于存储user_id
以及他们关注的用户ID {{1} }。
然后,使用a many-to-many relationship链接它们:
follow_id
答案 2 :(得分:-1)
在您的用户模型中定义mutators。
public function setFollowingAttribute(array $following) {
$this->attributes['following'] = implode(',', $following);
}
public function getFollowingAttribute(string $following) : array {
return explode(',', $following);
}