简体   繁体   中英

Best Practice to update hasMany Relationships with laravel

Hello Actually am trying to create an app in which every project has some users ie ProjectMembers .

here is project model with TeamMembers function.

class Project extends Model
{
    use HasFactory;

    function TeamMembers(){
        return $this->hasMany(ProjectMember::class);
    }
}

project members table schema.

Schema::create('projects_members', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('project_id')->nullable();
            $table->unsignedBigInteger('user_id')->nullable();
            $table->foreign('project_id')->references('id')->on('projects');
            $table->foreign('user_id')->references('id')->on('users');
            $table->timestamps();
        });

Now for updating project members i have to first delete relationships from Project members and then saving new one. because i have added multiselect dropdown. $request->team_members have type array.

public function update(Request $request, $id)
    {
        // return $request;
        $project = Project::findorfail($id);
        $project->name = $request->project_name;
        $project->details = $request->details;
        $project->start_date = $request->start_date;
        $project->end_date =  $request->end_date;
      
        $members = $request->team_members;
        ProjectMember::where('project_id', $id)->delete();
        $this->update_project_memebers($members, $project);
       
        return redirect('/projects');
        
    }
public function update_project_memebers($members, $project){
        foreach ($members as $member_id) {
            $project_member = new ProjectMember();
            $project_member->project_id = $project->id;
            $project_member->user_id = $member_id;
            $project_member->save();
        }
    }

here am deleting cuz if someone created project with two members and when the he/she want to update then he/she can remove one member from multiselect then i have to delete relationship cuz he/she selected only one user.

I don't think it's a good practice, so can i achieve this same func. with another way? thankyou.

First of all please make a proper naming convention of pivot tabel according to laravel and same for the model name too.

As of now the solution is

define relation as

Project

public function teamMembers()
{
    return $this->belongsToMany(ProjectMember::class, 'projects_members', 'project_id', 'member_id');
}

ProjectMember

public function projects()
{
    return $this->belongsToMany(Project::class, 'projects_members', 'member_id', 'project_id');
}

So now instead of deleting use sync() method. AS

$project->teamMembers()->sync($members);

Important docs,

https://laravel.com/docs/8.x/eloquent-relationships#syncing-associations

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM