循环通过Laravel 5中的输入数组

时间:2016-11-07 11:59:57

标签: php laravel

我有一个基本用户界面,用户可以在其中添加带有标签和值的简单列表。我想遍历该列表以将数据存储在" 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。它总是根据循环中的顺序设置它。如果我只是将一个细节设置为私有,那么它将是第一个。如果我设置两个,(无论哪个),它将是第一个和第二个。

我的逻辑显然有些问题,但我不知道是什么。

任何帮助都会非常感激。谢谢!

2 个答案:

答案 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>