不能在laravel数据库中存储简单数组

时间:2016-11-14 22:16:47

标签: php laravel

我想将用户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) {
...
}

我不认为这是最好的方法,但这是我能用我的技能包裹我的唯一方法。其他建议大多欢迎!

3 个答案:

答案 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);

Docs

答案 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);
}