php - 从 Laravel 5 中的动态表单将多行保存到数据库

标签 php jquery laravel laravel-5 eloquent

我正在使用 jQuery 生成两个动态字段。每对字段都显示在页面上,并且可以有多个实例。在提交时(不是 ajax),每对字段与 Auth::id() 一起保存到它们自己的表行中。

HTML 代码中有两个表单,两个值都已输入,用户单击“添加链接”,然后 jQuery 创建两个隐藏字段(这些是提交的字段)并且输入的数据直观地显示(附加)到 #链接列表。原来的字段变空了,这个过程可以重复...

我正在努力创建一个被 Eloquent 识别的数组以多次保存数据。

我收到错误“Undefined index: link”或 jQuery 中的第二个输入行。

Blade /HTML:

{!! Form::open(['route' => ['multiple.store'], 'method' => 'post', 'role'=> 'form', 'class' => 'form']) !!}

    <ul id="link-list">
        <!-- append new rows -->
    </ul>

    <div id="newlink" class="form-inline">
        <div class="form-group">
            {!! Form::text('prestore', null, ['placeholder' => 'Store name', 'class' => 'form-control']) !!}
        </div>
        <div class="form-group">
            {!! Form::text('prelink', null, ['placeholder' => 'Link / URL', 'class' => 'form-control']) !!}
        </div>
        <div class="form-group">
            <button class="btn btn-primary submit new-row" type="button">Add store link</button>
        </div>
    </div>

    <br/><br/>

    {!! Form::submit('Submit rows', ['class' => 'btn btn-success submit']) !!}

{!! Form::close() !!}

jQuery/JavaScript

$(document).on('click', '.new-row', function() {
    var store = $('#newlink input[name=prestore]').val();
    var link = $('#newlink input[name=prelink]').val();
    console.log(store, link);
    $('<li class="not-saved">' +
            '<a href="'+link+'">'+store+'</a>' +
            '<input type="hidden" name="rows[][link]" value="' + link + '">' +
            '<input type="hidden" name="rows[][store]" value="' + store + '">' +
        '</li>').appendTo('#link-list').hide().fadeIn(280);
    $('input[name=prestore]').val('');
    $('input[name=prelink]').val('');
});

Controller :

public function store()
{
    $input = Input::all();

    foreach ($input['rows'] as $row) {
        $items = new Multiple([
            'user_id' => Auth::id(),
            'store' => $row['store'],
            'link' => $row['link'],
        ]);
        $items->save();
    }
}

最佳答案

一个问题是你的 JavaScript 元素名称:

<input type="hidden" name="rows[][link]" value="' + link + '">
<input type="hidden" name="rows[][store]" value="' + store + '">

这将生成 $rows,如下所示:

[
    0 => ["link" => "foo"], 
    1 => ["store" => "bar"]
]

但是您的 PHP 代码希望 $rows 像这样:

[
    0 => [
        "link" => "foo",
        "store" => "bar"
    ], 
    1 => [
        "link" => "foo",
        "store" => "bar"
    ]
]

生成预期值的一种方法是在元素中指定行键:

<input type="hidden" name="rows[0][link]" value="' + link + '">
<input type="hidden" name="rows[0][store]" value="' + store + '">
<input type="hidden" name="rows[1][link]" value="' + link + '">
<input type="hidden" name="rows[1][store]" value="' + store + '">

显然,鉴于您提供的代码,这有点棘手,所以如果您需要这方面的帮助,请告诉我。

关于php - 从 Laravel 5 中的动态表单将多行保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31629082/

相关文章:

php - 从一个字段在一个查询中最大的表中获取数据

javascript - 使用 jquery dropkick 插件加载不同类型页面的奇怪问题

jquery - 对象函数 (a,b){return new e.fn.init(a,b,h)} 没有方法 'cookie'

php - Redis与Sentinel通信

php - Laravel SAIL_XDEBUG_MODE 不适用于调试网络调用

php - 如何自动重定向到另一个传递一些数据的 PHP 脚本?

java - 在 Java 中解析 URL

php - 如何检查发布的值是否已经存在于数据库中?

jquery - 如何使用 JQuery 调整窗口大小?

laravel 应用程序已移至另一台电脑