繁体   English   中英

从多个动态字段向数据库中插入两个二维数组-Laravel

[英]Inserting a two diminsionale array in database from multiple dynamic fields - Laravel

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

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

谢谢您的帮助。

IssueController.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 [▶] ] ] 

在这里您可以找到小提琴的链接

使用内置的雄辩方法可以发挥自己的优势。 首先,定义关系:

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();
}

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

小提琴

 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();
    }

用删除按钮解决您的问题。 添加到您的班级行,例如“删除此字段”。 并修改您的JavaScript代码以删除以下字段:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM