Laravel - 使用复选框从 pivot-table 中删除多个数据
Laravel - delete multiple data from pivot-table with checkbox
我正在尝试制作一个与复选框一起使用的标签删除。假设用户有大约 10 件产品,每件产品都有 3 个不同的标签。
目前用户只能删除一个标签。每次删除标签后,页面都会刷新,他可以删除另一个标签。这不是真正的用户友好。这就是为什么我要尝试对标签进行多项选择并单击一次按钮删除所有选定的标签。
这就是现在的样子:
{!! Form::open(['action' => 'ProductController@detach', 'method' => 'post']) !!}
<div class="container">
<div class="table-responsive">
<thead>
<tr>
<th>Product</th>
<th>Tags</th>
</tr>
</thead>
<tbody>
@foreach($products as $product)
<tr>
<td>{{ $product->name }}</td>
<td>
@foreach($product->tags as $tag)
{!! Form::hidden('tag_id', $tag->id) !!}
<input type="checkbox" name="xxxxx" value="{{ xxxx }}"><br>
@endforeach
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
{!! Form::button('Delete') !!}
{!! Form::close() !!}
我的问题是我需要 product_id + tag_id 来分离它们。
如果我按下删除按钮,我会将此数据传递到我的控制器:
{"tag_id":["285","284","285","286","279"],"product_id:"22"}
主要问题是,我的程序只给我最后一个 product_id。不管我是否没有从该产品中选择任何标签。它总是给我这个 product_id。我还需要传递给我的控制器的多个数组之类的东西。
这样的东西就完美了:
[0] = product_id = 1
tag_id = 50,60,80
[1] = product_id = 2
tag_id = 11,22,33
....
我对你的回答的回复:
很抱歉我迟到的回答..
我试过了,效果近乎完美。唯一的问题是,如果两个不同的产品具有相同的标签,我的程序只会 return 最后一个带有他的标签的产品。例如:
product_id 1 和 product_id 2 有 tag_id 3.
作为我需要的输出:product_id1 : tag_id 3, product_id2 : tag_id 3
但我只得到最后一个带有标签的 product_id,所有其他具有相同 tag_id 的产品都将被忽略。所以我得到的结果是:
product_id2 : tag_id3.
我希望你明白我想说的..我的英语不是最好的..
您可以像这样将复选框作为数组字段传递,键为标签 ID,值为产品 ID,
@foreach($product->tags as $tag)
<input type="checkbox" name="tagtodelete[{{ $tag->id.'-'.$product->id }}]" value="{{ $product->id }}"><br>
@endforeach
并且在您的控制器中,您可以获得数组形式的值,
$tagsleftoffs = (array) $request->input('tagtodelete');
foreach($tagsleftoffs as $tagId => $productId){
//perform your action here
$productId = explode('-',$tagId);
echo $productId[0] ; //is tag Id
echo $productId[1] ; //is product Id
}
表单复选框
您可以通过复选框值传递标签 ID 和产品 ID。
@foreach($product->tags as $tag)
<input type="checkbox" name="tagProductInfos[]" value="{{ $tag->id.'-'.$product->id }}"><br>
@endforeach
控制器接收函数:
然后,接收值并将tag id,product id分开。
foreach($request->get('tagProductInfos') as $tagInfo){
$explodedData = explode('-',$tagInfo);
$tagId = $explodedData[0] ; //is tag Id
$productId = $explodedData[1] ; //is product Id
echo 'tagId='.$tagId.' productId='.$productId.'<br>';
}
我正在尝试制作一个与复选框一起使用的标签删除。假设用户有大约 10 件产品,每件产品都有 3 个不同的标签。
目前用户只能删除一个标签。每次删除标签后,页面都会刷新,他可以删除另一个标签。这不是真正的用户友好。这就是为什么我要尝试对标签进行多项选择并单击一次按钮删除所有选定的标签。
这就是现在的样子:
{!! Form::open(['action' => 'ProductController@detach', 'method' => 'post']) !!}
<div class="container">
<div class="table-responsive">
<thead>
<tr>
<th>Product</th>
<th>Tags</th>
</tr>
</thead>
<tbody>
@foreach($products as $product)
<tr>
<td>{{ $product->name }}</td>
<td>
@foreach($product->tags as $tag)
{!! Form::hidden('tag_id', $tag->id) !!}
<input type="checkbox" name="xxxxx" value="{{ xxxx }}"><br>
@endforeach
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
{!! Form::button('Delete') !!}
{!! Form::close() !!}
我的问题是我需要 product_id + tag_id 来分离它们。
如果我按下删除按钮,我会将此数据传递到我的控制器:
{"tag_id":["285","284","285","286","279"],"product_id:"22"}
主要问题是,我的程序只给我最后一个 product_id。不管我是否没有从该产品中选择任何标签。它总是给我这个 product_id。我还需要传递给我的控制器的多个数组之类的东西。
这样的东西就完美了:
[0] = product_id = 1
tag_id = 50,60,80
[1] = product_id = 2
tag_id = 11,22,33
....
我对你的回答的回复:
很抱歉我迟到的回答..
我试过了,效果近乎完美。唯一的问题是,如果两个不同的产品具有相同的标签,我的程序只会 return 最后一个带有他的标签的产品。例如:
product_id 1 和 product_id 2 有 tag_id 3.
作为我需要的输出:product_id1 : tag_id 3, product_id2 : tag_id 3
但我只得到最后一个带有标签的 product_id,所有其他具有相同 tag_id 的产品都将被忽略。所以我得到的结果是:
product_id2 : tag_id3.
我希望你明白我想说的..我的英语不是最好的..
您可以像这样将复选框作为数组字段传递,键为标签 ID,值为产品 ID,
@foreach($product->tags as $tag)
<input type="checkbox" name="tagtodelete[{{ $tag->id.'-'.$product->id }}]" value="{{ $product->id }}"><br>
@endforeach
并且在您的控制器中,您可以获得数组形式的值,
$tagsleftoffs = (array) $request->input('tagtodelete');
foreach($tagsleftoffs as $tagId => $productId){
//perform your action here
$productId = explode('-',$tagId);
echo $productId[0] ; //is tag Id
echo $productId[1] ; //is product Id
}
表单复选框
您可以通过复选框值传递标签 ID 和产品 ID。
@foreach($product->tags as $tag)
<input type="checkbox" name="tagProductInfos[]" value="{{ $tag->id.'-'.$product->id }}"><br>
@endforeach
控制器接收函数:
然后,接收值并将tag id,product id分开。
foreach($request->get('tagProductInfos') as $tagInfo){
$explodedData = explode('-',$tagInfo);
$tagId = $explodedData[0] ; //is tag Id
$productId = $explodedData[1] ; //is product Id
echo 'tagId='.$tagId.' productId='.$productId.'<br>';
}