【问题标题】:Best Practice to update hasMany Relationships with laravel使用 laravel 更新 hasMany 关系的最佳实践
【发布时间】:2021-09-27 21:24:07
【问题描述】:

您好,实际上我正在尝试创建一个应用,其中每个项目都有一些用户,即 ProjectMembers

这是具有 TeamMembers 功能的项目模型。

class Project extends Model
{
    use HasFactory;

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

项目成员表架构。

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

现在要更新项目成员,我必须首先从项目成员中删除关系,然后保存新的。因为我添加了多选下拉菜单。 $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();
        }
    }

如果有人创建了有两个成员的项目,并且当他/她想要更新然后他/她可以从多选中删除一个成员,那么我必须删除关系因为他/她只选择了一个用户。

p>

我认为这不是一个好习惯,所以我可以实现同样的功能。用另一种方式? 谢谢。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    首先请根据 laravel 制定一个正确的命名约定pivot tabel,模型名称也一样。

    目前解决方案是

    将关系定义为

    项目

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

    项目成员

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

    所以现在不要删除使用 sync() 方法。作为

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

    重要文档,

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

    【讨论】:

      猜你喜欢
      • 2020-05-08
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多