2016-11-14 139 views
0

我想将用户标识存储在我的User行的一列中,因为人们可以“跟随”其他人。在laravel数据库中存储简单数组

所以如果我是一个用户,我可以关注多个用户。这个我想以超级简单的格式存储,如数据库中的[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上,并且在那里一切都像魅力一样,所以我根本不明白为什么这不起作用ING。在该数据库中的其他系统中,数据如前所述存储。

我不想很多序列化,因为这必须是简单的,所以我可以做一个

$following = User::whereIn('id', $user->following)->get(); 

foreach($follwing as $follow) { 
... 
} 

我不认为这是做的最好的方式,但是这是我能的唯一途径用我的技能缠住我的头。其他建议大多是欢迎的!

+4

为什么不创建另一个表有两列:USER_ID(一以下),并follow_id(他们是按照用户的ID)。然后,您可以使用hasMany关系来获取某人正在关注的用户。 – aynber

+0

你可以使用$ table-> json('following');而不是字符串并将数据存储为json。和json_decode同时获取数据。在Laravel 5.3中,你也可以通过json查询。 –

回答

2

这不是Laravel存储数据的方式。您应该创建一个新表来存储关注者的数据。

这可以通过在用户表本身之间创建一个many-to-many关系来实现。

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; 

与栏目创建followers_following表要将数据保存在数据库中,您可以这样做:

$user->following()->attach($follow); 

Docs

-1

在您的用户模型中定义mutators

public function setFollowingAttribute(array $following) { 
    $this->attributes['following'] = implode(',', $following); 
} 
public function getFollowingAttribute(string $following) : array { 
    return explode(',', $following); 
} 
+1

这种结构对于OP的用例基本上是不可查询的。突变体/访问器是解决这个问题的错误方法。 – ceejayoz

+0

我的解决方案考虑到OP将自己限制为单个字符串列。 –

+0

有时候,一个问题的正确答案是“停止,不要这样做”。 – ceejayoz

1

首先,如果你想数组数据存储到数据库中,最好列类型可能是$table->json('following')。加上a cast of that attribute to JSON in your model,这将使Laravel自动保存/检索阵列数据。

这就是说,你真的不希望这样做的跟随者数据的东西。虽然有些数据库引擎可以索引JSON数据,但其他数据库引擎不能,并且将其存储为字符串更糟糕。 SQL是关系型的,并且用户 - >追随者关联是关系

相反,您需要一个单独的表,如user_follows,它存储user_id以及他们跟随的用户的标识,如follow_id

然后,使用a many-to-many relationship将它们连接:

public function followers() { 
    return $this->belongsToMany('App\User', 'user_follows', 'user_id', 'follow_id'); 
} 

public function following() { 
    return $this->belongsToMany('App\User', 'user_follows', 'follow_id', 'user_id'); 
} 
相关问题