【问题标题】:Inserting a two diminsionale array in database from multiple dynamic fields - Laravel从多个动态字段在数据库中插入一个二维数组 - Laravel
【发布时间】:2019-08-22 14:27:46
【问题描述】:

我使用 Laravel 创建了一个表单,可以使用 jQuery 添加和删除动态输入字段。

我现在正在尝试将数据插入数据库,但遇到了问题。我的数据库存在两个表;任务和问题。 “问题”表链接到任务表 bij task_id。这个 task_id 也应该发送到数据库,但我无法得到它,赖特。请参阅下面的代码。

感谢您的帮助。

问题控制器.php

  • 第一种方法有效,但我的任务 ID 为“null”。从所有字段中插入所有记录。
  • 第二种方法只添加了1个字段的数据,但添加了正确的id。
public function store(Request $request, Issue $issue, Task $task)
 {
    ## First method
    // foreach($request->issueInfo as $key => $value) {
    //     Issue::create($value);
    // }
    ## Second method
    foreach ($request->issueInfo as $key => $name) {
        dd($name);
        $names[] = [
            'task_id'    => $task->id,
            'issue_name' => $name,
            'issue_time' => $name,
            'issue_date' => $name,
            'issue_type' => $name,
        ];
    }
    Issue::insert($names);
    return back();
}

web.php

Route::post('/tasks/{task}/issues',    'IssueController@store');

show.blade.php

@extends('layout')
@section('content')
<script>
    $(document).ready(function() {
        var i = 1;
        $('.addmore').click(function(){
            i++;
            $('#dynamicFields').append('<div class="form-group"><label for="issue_name">Issue Name</label><select class="form-control" name="issueInfo['+i+'][issue_name]"><option></option><option value="Error">Error</option><option value="Grammer">Grammer</option><option value="Undefined">Undefined</option><option value="Typpo">Typpo</option><option value="No errors">No errors</option></select></div><div class="form-group"><label for="issue_date" class="label">Issue Date</label><input class="form-control" type="date" name="issueInfo['+i+'][issue_date]"></div><div class="form-group"><label for="issue_time" class="label">Issue Time</label><input class="form-control" type="time" name="issueInfo['+i+'][issue_time]" ></div><div class="form-group"><label for="issue_type" class="label">Issue Type</label><select class="form-control" name="issueInfo['+i+'][issue_type]"><option></option><option value="False45">False45</option><option value="False104">False104</option></select></div><div class="form-group"><button type="button" class="btn btn-danger remove-field">Remove</button></div>');
            });
        // Removing fields
        $('#dynamicFields').on('click', '.remove-field', function(){
            $(this).parents('div').remove(); i--;
        })
    });
</script>
<div class="form-group"><label for="issue_name">Name</label></div>
<head>Testing the creation of multiple fields</head>
<form action="/tasks/{{$task->id}}/issues" method="post" >
    @csrf
    <div id="dynamicFields">
        <div class="form-group">
            <label for="issue_name">Issue Name</label>
            <select class="form-control" name="issueInfo[0][issue_name]">
                <option></option>
                <option value="Error">Error</option>
                <option value="Grammer">Grammer</option>
                <option value="Undefined">Undefined</option>
                <option value="Typpo">Typpo</option>
                <option value="No errors">No errors</option>
            </select>
        </div>
        <div class="form-group">
            <label for="issue_date" class="label">Issue Date</label>
            <input class="form-control" type="date" name="issueInfo[0][issue_date]" value="{{old('issue_date')}}">
        </div>
        <div class="form-group">
            <label for="issue_time" class="label">Issue Time</label>
            <input class="form-control" type="time" name="issueInfo[0][issue_time]" value="{{old('issue_time')}}">
        </div>
        <div class="form-group">
            <label for="issue_type" class="label">Issue Type</label>
            <select class="form-control" name="issueInfo[0][issue_type]">
                <option></option>
                <option value="False45">False45</option>
                <option value="False104">False104</option>
            </select>
        </div>
        <div class="form-group">
            <input type="button" name="submit" id="submit" class="btn btn-primary addmore" value="+" />
        </div>
        <div class="form-group">
            <button type="submit" class="btn btn-primary">New Location</button>
        </div>
    </div>
</form>
@endsection
当我在控制器中执行 dd($names) 时输出
                array:1 [▼
          0 => array:5 [▼
            "task_id" => 1
            "issue_name" => array:4 [▼
              "issue_name" => "Error"
              "issue_date" => null
              "issue_time" => null
              "issue_type" => null
            ]
            "issue_time" => array:4 [▼
              "issue_name" => "Error"
              "issue_date" => null
              "issue_time" => null
              "issue_type" => null
            ]
            "issue_date" => array:4 [▶]
            "issue_type" => array:4 [▶]
          ]
        ]

Here you can find a link to fiddle

【问题讨论】:

  • 你的代码有什么问题?
  • 你能显示路线定义吗?
  • @GiacomoM 我无法将所有记录发送到数据库。在我的控制器中,我必须将生成的数组发送到数据库。我在发送所有数据时遇到问题。 1 所有数据都已发送,但我的 task_id 为空。在第二种方法中,我尝试添加正确的 id,但所有其他字段都为 null 而不是给定的值。
  • @Bryan 我已发送路线
  • 我刚刚注意到,当您按下删除键时。所有字段都消失了,这会发生吗?

标签: php arrays laravel input field


【解决方案1】:

您应该尝试以下方法。我稍微修改了你的代码。不要将所有内容都推送到同一个数组中,而是将每个元素存储在一个单独的数组中。在小提琴中,您可以找到适配代码。在您的控制器中,您应该执行以下操作。您还应该删除 Issue $issue,因为您没有使用它。

Fiddle

 public function store(Request $request, Task $task)
    {
        //


        foreach ($request->issue_name as $index  => $name) {

            $task->issues()->create([
                'issue_name' => $name,
                'issue_time' => $request->issue_time[$index],
                'issue_date' => $request->issue_date[$index],
                'issue_type' => $request->issue_type[$index]
            ]);

        }


        return back();
    }

使用删除按钮解决您的问题。添加到您的班级行中,例如“remove-this-field”。并调整您的 javascript 代码以删除字段:

$('#dynamicFields').on('click', '.remove-fields', function(){
   $('.remov-this-field').remove(); i--;
})

【讨论】:

    【解决方案2】:

    使用内置的 Eloquent 方法对您有利。首先,定义关系:

    class Task
    {
        public function issues()
        {
            return $this->hasMany(Issues::class);
        }
    {
    
    class Issue
    {
        public function task()
        {
            return $this->belongsTo(Task::class);
        }
    {
    

    接下来,写一个好的辅助方法。请注意create() 方法已经接受了一个数组输入,因此您不必通过所有数组键来foreach

    class Task
    {
        ...
    
        public function addIssue($issue)
        {
            return $this->issues()->create($issue);
        }
    }
    

    控制器逻辑可以简化,这是做一些服务器端验证的好机会:

    public function store(Request $request, Task $task)
    {
        $attributes = request()->validate([
            // issue validation rules here
        ]);
    
        $task->addIssue($attributes);
    
        return back();
    }
    

    【讨论】:

      【解决方案3】:

      您可以尝试在表单中添加隐藏字段,您应该将该字段的值设置为 task_id,然后在您提交表单时将其传递给 Controller。
      我认为在那之后您的第一种方法应该可以正常工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-17
        • 2021-01-23
        • 2012-10-18
        • 2015-10-09
        • 2017-06-21
        • 2021-02-06
        • 2020-08-26
        • 2020-07-25
        相关资源
        最近更新 更多