Laravel 每个用户只有一个 friend_id
Laravel only one friend_id per user
我只是从 laravel 开始,想知道是否有人可以提供帮助,我从数据库中创建了 friend_id 和 user_id,并在将 user_id 添加到 friend_id 的视图(还不确定 XD 的术语是什么)一切正常,但每次我按下添加好友按钮时,好友用户都会重复,所以我的问题是如何如何添加用户而不让用户复制数据?
好友控制器
public function store(Request $request)
{
//check I have a post with a friend id
$validator = Validator::make($request->all(), [
'friend_id' => 'required'
]);
if ($validator->fails()) {
return redirect('/posts')
->withErrors($validator)
->withInput();
}
//get the current user
$user = Auth::user();
//attach friend to current user
$data = [
'friend_id' => $request->input('friend_id'),
'user_id' => $user->id,
];
$friend = $user->friends()->where('friend_id', $request->input('friend_id'))->get();
$friend = $user->friends()->create($data);
//redirect back to XXX
return redirect('/posts');
}
<div class="row justify-content-md-center">
<div class="col-3 mt-3">
@foreach ($friends as $friend)
<form method="post" action="/friends">
@csrf
<div class="text-center border p-2">
{{ $friend->id }}
{{ $friend->name }}
<div class="row justify-content-center">
<button type="submit" name="friend_id" value="{{$friend->id}}" class="btn btn-primary">Add Friend</button>
</div>
</div>
</form>
@endforeach
</div>
</div>
这是我老板的建议,在数据库中只添加一个好友 ID 就可以了
//check I have a post with a friend id
$validator = Validator::make($request->all(), [
'friend_id' => 'required'
]);
if ($validator->fails()) {
return redirect('/posts')
->withErrors($validator)
->withInput();
}
//get the current user
$user = Auth::user();
//attach friend to current user
$data = [
'friend_id' => $request->input('friend_id'),
'user_id' => $user->id,
];
$friend = $user->friends()->where('friend_id', $request->input('friend_id'))->get();
if(!$friend)
{
$friend = $user->friends()->create($data);
}
您可以使用 firstOrCreate 轻松完成此操作:
public function store(Request $request)
{
$request->validate([
'friend_id' => 'required'
]);
auth()->user()->friends()->firstOrCreate([
'friend_id' => $request->friend_id
]);
}
但是逻辑有点不对,
我猜,你的 friends() 用户模型上的关系指的是 2 个用户(某种程度上)之间的枢轴 table
你应该这样做:
枢轴 table :
编号 | user_id | friend_id
用户模型:
public function friends(){
return $this->belongsToMany(User::class, 'friends', 'user_id', 'friend_id');
}
然后在你的控制器中:
auth()->user()->friends()->syncWithoutDetaching([$request->friend_id]);
我只是从 laravel 开始,想知道是否有人可以提供帮助,我从数据库中创建了 friend_id 和 user_id,并在将 user_id 添加到 friend_id 的视图(还不确定 XD 的术语是什么)一切正常,但每次我按下添加好友按钮时,好友用户都会重复,所以我的问题是如何如何添加用户而不让用户复制数据?
好友控制器
public function store(Request $request)
{
//check I have a post with a friend id
$validator = Validator::make($request->all(), [
'friend_id' => 'required'
]);
if ($validator->fails()) {
return redirect('/posts')
->withErrors($validator)
->withInput();
}
//get the current user
$user = Auth::user();
//attach friend to current user
$data = [
'friend_id' => $request->input('friend_id'),
'user_id' => $user->id,
];
$friend = $user->friends()->where('friend_id', $request->input('friend_id'))->get();
$friend = $user->friends()->create($data);
//redirect back to XXX
return redirect('/posts');
}
<div class="row justify-content-md-center">
<div class="col-3 mt-3">
@foreach ($friends as $friend)
<form method="post" action="/friends">
@csrf
<div class="text-center border p-2">
{{ $friend->id }}
{{ $friend->name }}
<div class="row justify-content-center">
<button type="submit" name="friend_id" value="{{$friend->id}}" class="btn btn-primary">Add Friend</button>
</div>
</div>
</form>
@endforeach
</div>
</div>
这是我老板的建议,在数据库中只添加一个好友 ID 就可以了
//check I have a post with a friend id
$validator = Validator::make($request->all(), [
'friend_id' => 'required'
]);
if ($validator->fails()) {
return redirect('/posts')
->withErrors($validator)
->withInput();
}
//get the current user
$user = Auth::user();
//attach friend to current user
$data = [
'friend_id' => $request->input('friend_id'),
'user_id' => $user->id,
];
$friend = $user->friends()->where('friend_id', $request->input('friend_id'))->get();
if(!$friend)
{
$friend = $user->friends()->create($data);
}
您可以使用 firstOrCreate 轻松完成此操作:
public function store(Request $request)
{
$request->validate([
'friend_id' => 'required'
]);
auth()->user()->friends()->firstOrCreate([
'friend_id' => $request->friend_id
]);
}
但是逻辑有点不对,
我猜,你的 friends() 用户模型上的关系指的是 2 个用户(某种程度上)之间的枢轴 table
你应该这样做:
枢轴 table :
编号 | user_id | friend_id
用户模型:
public function friends(){
return $this->belongsToMany(User::class, 'friends', 'user_id', 'friend_id');
}
然后在你的控制器中:
auth()->user()->friends()->syncWithoutDetaching([$request->friend_id]);