Laravel - 使用复选框将数据发送到数据透视表

Posted

技术标签:

【中文标题】Laravel - 使用复选框将数据发送到数据透视表【英文标题】:Laravel - Sending data to pivot table using a checkbox 【发布时间】:2015-08-01 14:43:58 【问题描述】:

我有 3 张桌子:projects - users - project_user

这是一个ManyOnMany 关系,所以我有一个数据透视表。

我使用belongsToMany通过我的模型将它们链接起来。

现在我的问题来了。

我有一张这样的桌子:

所以我选择了一个project,还有一个带有usersactive/contribute 复选框的表格。 当active/contribute 复选框被选中时,用户将被链接到项目。

所以在我的脑海中,我有这样的想法:

checkbox被选中时,它需要将user_id包括$this->project_id发送到数据透视表project_user,这样它就会链接项目用户。

但现在的问题是我不知道如何将其用于工作代码。

HTML/刀片:

@foreach($users as $user)
<tr>
    <td>
        $user->firstname $user->middlename $user->lastname
    </td>

    <td>
        <input name='contribute' type='hidden' value='0'>
            !! Form::checkbox('', '1', false) !!
    </td>
</tr>
@endforeach

型号:

用户

public function projects() 

    return $this->belongsToMany('App\Project', 'project_user', 'user_id', 'project_id');

项目

public function users()

   return $this->belongsToMany('App\User', 'project_user', 'project_id', 'user_id');

控制器:

public function edit($id, Project $project)

    $users = User::all();

    $project = $this->project->find($id);

    return view('project.edit', ['project' => $project, 'id' => 'edit'], compact('users'));


public function update(CreateProjectRequest $request, $project)

    $project = $this->project->find($project);
    $project->fill($request->input())->save();

    return redirect('project');

如果需要提供任何其他代码,请告诉我

【问题讨论】:

【参考方案1】:

您可以创建如下所示的输入数组,但您必须检查此用户是否已与此项目关联。

!! Form::checkbox('contribute['.$user->id.']', '1', $checkifinproject) !!

然后在控制器中更新时使用sync。 但在此之前,因为您只想要复选框中值为 1 的 ids,所以您必须过滤掉零值,然后只保留数组 $request-&gt;input('users') 的键。

 $project = $this->project->find($project);
 $project->sync($prepared_ids);

然后,Sync 将从表中删除与该项目关联的所有以前的 user_id,并保存新的。

【讨论】:

if($request-&gt;get('contribute')) foreach($request-&gt;get('contribute') as $k =&gt; $contribute) if($contribute == 1) $project = $this-&gt;project-&gt;find($request-&gt;project_id); $project-&gt;users()-&gt;attach($k); , &lt;input name="contribute[$user-&gt;id]" type="checkbox" value="1"/&gt; ,这是我现在拥有的,它会添加到表格中,但它会继续添加到表格中并且不会显示它已经添加了 是的,只要我继续点击“编辑”,它将被添加到数据库中,新规则将被添加,例如:(id = 1 , project_id = 5, user_id = 1 )、(id = 1 , project_id = 5, user_id = 2 ) 等等 好的,那么唯一的事情就是你必须检查这个用户是否在这个项目中,如果为真,则将checked属性添加到复选框 什么是可行/有效的方法?我被这个问题困扰了很长时间,我无法直接考虑它atm

以上是关于Laravel - 使用复选框将数据发送到数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 复选框问题,我无法更新数据透视表

如何在 LARAVEL_7 中通过迁移发送多个复选框

将数据添加到 Laravel 数据透视表

Laravel - 将其他列值保存到数据透视表

如何通过laravel创建数据透视表

防止 Laravel 向数据透视表添加多条记录