我有一个基本用户界面,用户可以在其中添加带有标签和值的简单列表。我想遍历该列表以将数据存储在" Detail"模型。
我有以下代码。
控制器:
$details = $request->input('detail_label');
foreach($details as $key => $value)
{
if(!empty($request->input('detail_value.'.$key))) {
// if the detail has an existing ID
if($request->input('detail_id.'.$key)) {
$detail = Detail::find($request->input('detail_id.'.$key));
} else {
$detail = new Detail;
}
$detail->type = $request->input('detail_type.'.$key);
$detail->label = $request->input('detail_label.'.$key);
$detail->value = $request->input('detail_value.'.$key);
if($request->input('detail_privacy.'.$key) == 1) {
$detail->privacy = 1;
} else {
$detail->privacy = 0;
}
$user->details()->save($detail);
}
}
查看:
@foreach($user->details as $detail)
<div class="detail">
<input type="hidden" name="detail_id[]" value="{{ $detail->id }}">
<label>Type
<select name="detail_type[]">
<option @if($detail->type == '1')selected @endif value="1">Phone</option>
<option @if($detail->type == '2')selected @endif value="2">Phone (mobile)</option>
<option @if($detail->type == '3')selected @endif value="3">URL</option>
<option @if($detail->type == '4')selected @endif value="4">Email</option>
</select>
</label>
<label>Label
<input type="text" name="detail_label[]" value="{{ $detail->label }}">
</label>
<label>Value
<input type="text" name="detail_value[]" value="{{ $detail->value }}">
</label>
<label>Private?
<input type="checkbox" name="detail_privacy[]" @if($detail->privacy == true) checked @endif value="1">
</label>
<label>Delete?
<input type="checkbox" name="detail_delete[]" value="{{ $detail->id }}">
</label>
</div><!-- / detail -->
@endforeach
除了detail_privacy字段之外,我的代码的每个方面都按照我的计划运行。它设置和取消设置布尔隐私属性,但它不关注我想要的$ key。它总是根据循环中的顺序设置它。如果我只是将一个细节设置为私有,那么它将是第一个。如果我设置两个,(无论哪个),它将是第一个和第二个。
我的逻辑显然有些问题,但我不知道是什么。
任何帮助都会非常感激。谢谢!
答案 0 :(得分:2)
它不起作用的原因是未检查的复选框不包含在发布数据中。您可以通过转储$request->input('detail_privacy')
的值来看到它。
要同时编辑现有内容并添加新详细信息,您需要在表单中的输入上设置键。真的,只要你跟踪它。为了简化操作,您可以添加与复选框名称相同的隐藏输入,因此detail_privacy
将始终存在于帖子数据中。例如:
@foreach ($user->details as $key => $detail)
<input type="hidden" name="detail_id[{{ $key }}]" value="{{ $detail->id }}">
...
<input type="hidden" name="detail_privacy[{{ $key }}]" value="0">
<input type="checkbox" name="detail_privacy[{{ $key }}]" @if($detail->privacy == true) checked @endif value="1">
...
@endforeach
如果您动态添加新字段,即。使用javascript你需要尊重这些键。它非常简单,只需将$key
的最后一个值传递给你的js就可以了。
另外,我建议输入名称使用不同的表示法:details[{{ $key }}][id]
而不是detail_id[{{ $key }}]
。这样控制器动作将变得更加简单:
foreach ($details as $detail) {
if (! empty($detail['id'])) {
...
}
}
答案 1 :(得分:0)
如果布尔值在数据库中存储为TINYINTS
(如:0或1);然后可能取出布尔true || false
可能会解决问题。不确定,但猜测值得尝试:
<!-- JUST TRY IT LIKE SO: @if($detail->privacy) checked @endif -->
<label>Private?
<input type="checkbox"
name="detail_privacy[]"
@if($detail->privacy) checked @endif value="1"
>
</label>
或假设:
<!-- YOU MAY ALSO USE "1" LIKE SO: @if($detail->privacy==1) checked @endif -->
<label>Private?
<input type="checkbox"
name="detail_privacy[]"
@if($detail->privacy==1) checked @endif value="1"
>
</label>