简体   繁体   English

更新 hasMany Relationships 的最佳实践 laravel

[英]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 .您好实际上我正在尝试创建一个应用程序,其中每个项目都有一些用户,即ProjectMembers

here is project model with TeamMembers function.这是项目 model 和团队成员 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. $request->team_members具有数组类型。

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.首先请根据 laravel 对pivot 表进行适当的命名约定,model 名称也相同。

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.所以现在不是删除使用 sync() 方法。 AS作为

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

Important docs,重要文件,

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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