【问题标题】:Save array [ ] of form data in same columns individual row - Laravel将表单数据的数组 [] 保存在同一列中的单个行中 - Laravel
【发布时间】:2022-09-24 22:02:11
【问题描述】:

当用户单击添加更多并提交他们的表单数据时,我在数据库行中保存这样的表单数组(服务 [],金额 [],描述 [])时遇到问题。我有两个相关的发票和 invoice_details 表,我希望表单数组将表单数据列表提交到 invoice_details 表中。我已经成功创建了发票和 invoice_details 之间的模型和关系。

<!--Blade --> 

<div class=\"service-box\">

                          <div class=\"row\">

                            <div class=\"col-md-12 service-group\">
                                  <div class=\"row\">
                                      <div class=\"form-group mb-3 col-md-6\">
                                          <label class=\"form-label\">Service</label>
                                          <div >
                                              <select type=\"text\" class=\"form-select\" placeholder=\"Services\" value=\"\" name=\"service[]\" id=\"service\">
                                                  <option value=\"\" disabled selected>Select your option</option>
                                                  @foreach ($services as $service)
                                                      <option value=\"{{$service->service_name}}\"  data-id=\"{{$service->amount}}\">{{$service->service_name}}</option>
                                                  @endforeach
                                                  
                                                  
                                              </select>
                                              
                                          </div>
                                          </div>
              
                                          <div class=\"form-group mb-3 col-md-6\">
                                          <label class=\"form-label\">Amount</label>
                                          <div >
                                              <input type=\"text\" class=\"form-control\" name=\"amount[]\" id=\"amount\" placeholder=\"Amount\" readonly>
                                        
                                          </div>
                                      </div>
                                      <div class=\"form-group mb-3 col-md-12\">
                                        <label class=\"form-label\">Description</label>
                                        <textarea class=\"form-control\" id=\"description\" name=\"description[]\" rows=\"6\" placeholder=\"Description..\" ></textarea>
                                    </div>
                                  </div>

                            </div>

                            
                          </div>

                      </div>
        //Controller

        $invoicedetailModel = new Invoice_detail;


        //Here is where the problem lies, I have to save for arrays.
        $invoicedetailModel->service = request(\'service\');
        $invoicedetailModel->amount = request(\'amount\');
        $invoicedetailModel->description = request(\'description\');

        $invoiceModel->Invoice_details()->save($invoicedetailModel);
  • 您是否在 request(\'service\') request(\'amount\') 和 request(\'description\'); 上获得值?
  • 循环遍历结果。
  • @jmvcollaborator 是的,我按预期获得了输入的数组值。
  • @brombeer是的,我为每个循环做了一个,它只存储数组的一个值。
  • 没有迭代并且考虑到它们是数组已经这样做了吗? $invoiceModel->Invoice_details()->createMany($invoicedetailModel);

标签: laravel eloquent


【解决方案1】:

在我看来(如果我误解了,请纠正我)您正在尝试保存一批不同的 InvoiceDetails 并将它们附加到原始 Invoice 模型。

这里的问题是您试图通过将数组传递给单个 invoiceDetails 模型来做到这一点,所以假设您有两个通过表单传递的详细信息实例,您的请求参数结构如下:

$request->service: ['serviceX','serviceY']
$request->amount: [1,2]
$request->description: ['Lorem', 'Ipsum']

因此,如果您尝试创建要保存在代码中的模型,您将执行以下操作:

Invoice_Details::create([
    'service' => ['serviceX', 'serviceY'],
    'amount' => [1,2]
    'description' => ['Lorem', 'Ipsum']
]);

哪个不起作用,因为这些值没有设置为数据库的 Json,并且还解释了为什么 createMany 不起作用,因为有一个对象为每个值使用一组值。您可能想要的是这样的情况:

Invoice_Details::createMany([
    [
        'service' => 'serviceX',
        'amount' => 1
        'description' => 'Lorem'
    ],
    [
        'service' => 'serviceY',
        'amount' => 2
        'description' => 'Ipsum'
    ]
]);

所以你应该迭代请求参数并保存一个整个数组单一模型,而不是试图把所有东西都塞进一个单一的模型中。

此外,问自己“当然,但它们都有两个参数,为什么在我使用 createMany 方法时不直接拆分它们?”是很合理的。好吧,让我们假设具有不同参数的相同情况:

$request->service: ['serviceX','serviceY']
$request->amount: [1,2]
$request->description: ['Ipsum']

该描述属于哪个模型?我们可以只是按出现顺序进行,但这种假设可能会在执行不良的情况下导致巨大的问题。可悲的是,这意味着每次我们需要创建多个模型时,我们都需要定义每一个模型,即使这意味着事先添加一个迭代。

TL;博士:您需要一组模型,而不是一组参数。在保存之前迭代您的参数并构建您的模型。

//Supposing you already fetched the arrays and they are all of the same length
$details = [];

foreach($services as $key => $service) {

        $invoicedetailModel = new Invoice_detail();

        $invoicedetailModel->service = $services[$key];
        $invoicedetailModel->amount = $amounts[$key];
        $invoicedetailModel->description = $descriptions[$key]);

        $details[] = $invoicedetailModel;
}
// code to create and attach the many models

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多