Skip to content
Advertisement

Laravel only one friend_id per user

I’m only starting with laravel and was wondering if anyone could help, I’ve created a friend_id and user_id from the database and have made a form in the view that adds the user_id to the friend_id (not sure what the terminology is for anything yet XD) everything working fine but each time I press the add friend button the friend user duplicates, so my question is how do I add a user without the user duplicating data?

FriendsController

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>

This is what my boss suggested and it works to only add one friend id in the database at all

//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);
}

Advertisement

Answer

you can do this easily with a firstOrCreate :

public function store(Request $request)
{
     $request->validate([
'friend_id' => 'required'
]);       

auth()->user()->friends()->firstOrCreate([
 'friend_id' => $request->friend_id
]);
}

But the logic is quite a bit wrong,

as I guess, your friends() relation on the User Model refer to a pivot table between 2 users (sort of)

You should just do this :

Pivot table :

id | user_id | friend_id

User Model :

public function friends(){
    return $this->belongsToMany(User::class, 'friends', 'user_id', 'friend_id');
}

then in your controller :

auth()->user()->friends()->syncWithoutDetaching([$request->friend_id]);
User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement