Laravel 将动态输入数据数组保存到数据库中

Posted

技术标签:

【中文标题】Laravel 将动态输入数据数组保存到数据库中【英文标题】:Laravel saving dynamic input data array in to database 【发布时间】:2016-05-05 08:47:33 【问题描述】:

我正在尝试在 laravel 中保存动态表单。无法将数据数组保存到数据库中。以下是表格。

简而言之普通表单字段

!! Form::select('customer_id', ['' => 'Select a customer'] + $customer_list ,null , array('class' => 'form-control', 'id' => 'customer')) !!
!! Form::text('mileage_in', null, ['class' => 'form-control', 'placeholder' => 'Mileage In']) !!
.
.
.etc...

动态表单域

!! Form::select('item_id[][item_id]', $items, null, array('class' => 'form-control')) !!
!! Form::text('item_description[][item_description]', null, ['class' => 'form-control', 'placeholder' => 'Not Required | Optional']) !!
!! Form::text('units[][units]', null, ['class' => 'form-control', 'placeholder' => 'Add Units']) !!
!! Form::text('rate[][rate]', null, ['class' => 'form-control', 'placeholder' => 'Add Rate']) !!
!! Form::text('amount[][amount]', null, ['class' => 'form-control', 'placeholder' => 'Add Hrs and Rate', 'id' => 'amount']) !!

所有这些字段都采用相同的格式。 我将这些数据保存到三个不同的表中。

以下是我创建的模型。估计表的估计模型

class Estimate extends Model

    protected $fillable = [
        'customer_id',
        'vehicle_id',
        'mileage_in',
        'net_amount',
        'parent_estimate_id',
        'department',
        'created_by'
    ];
    public function customer()
        return $this->belongsTo('App\Customer');
    
    public function vehicle()
        return $this->belongsTo('App\Vehicle');
    
    public function estimate_details()
        return $this->hasMany('App\EstimateDetail');
    

estimate_details 表的 EstimateDetail 模型

class EstimateDetail extends Model

    protected $fillable = [
        'estimate_id',
        'item_id',
        'item_description',
        'units',
        'rate',
        'labor_amount_final',
        'initial_amount',
        'task_status'
    ];
    public function item()
    
        return $this->hasMany('App\Item');
    
    public function estimate()
    
        return $this->belongsTo('App\Estimate');
    

项目表的项目模型

class Item extends Model

    protected $fillable = [
        'name',
        'type',
        'location',
        'quantity',
        'sale_price',
        'unit_of_sale',
        'pre_order_level',
        'created_by',
        'category_id',
        'service_only_cost',
        'updated_at'
    ];
    public function estimate_details()
    
        return $this->hasMany('App\EstimateDetail');
    

以下代码是 EstimatesController

class EstimatesController extends Controller

public function store(EstimateRequest $request)
    
        $user_id = '1';

        $input = $request->all();

        $vehicle = new Vehicle();
        $vehicle->customer_id = $input['customer_id'];
        $vehicle->reg_no = $input['reg_no'];
        $vehicle->make = $input['make'];
        $vehicle->model = $input['model'];
        $vehicle->created_by = $user_id;

        $estimate = new Estimate();
        $estimate->customer_id = $input['customer_id'];
        $estimate->vehicle_id = $input['vehicle_id'];
        $estimate->mileage_in = $input['mileage_in'];
        $estimate->department = $input['department'];
        $estimate->created_by = $user_id;

        $estimate_detail = new EstimateDetail();
        $estimate_detail->item_id = $input['item_id'];
        $estimate_detail->item_description = $input['item_description'];
        $estimate_detail->units = $input['units'];
        $estimate_detail->rate = $input['rate'];
        $estimate_detail->initial_amount = $input['amount'];

        $vehicle->save($request->all());
        $vehicle->estimate()->save($estimate);
        $estimate->estimate_details()->save($estimate_detail);
      
        return redirect('/estimates');
  

我可以成功保存车辆和估计表上的车辆和估计数据。但我无法在estimate_details 表上保存估计详细信息数组。尝试了许多不同的方法,但最终失败了。

【问题讨论】:

【参考方案1】:

我猜估计 id 丢失了。而且你不能像这样插入数组。单品试试这个:

    $vehicle->save($request->all());
    $vehicle->estimate()->save($estimate);
    $estimate_detail->estimate_id = $estimate->id;
    $estimate->estimate_details()->save($estimate_detail);

希望对你有帮助。

【讨论】:

感谢您的回复。我以前试过这个。但我收到了这个错误。 “preg_replace():参数不匹配,pattern是字符串,replacement是数组” 是的,因为您试图一次插入数组。在您的项目之后添加一个索引,例如 $estimate_detail->item_id = $input['item_id'][0]; $estimate_detail->item_description = $input['item_description'][0]; $estimate_detail->units = $input['units'][0]; $estimate_detail->rate = $input['rate'][0]; $estimate_detail->initial_amount = $input['amount'][0];如果有效,则进行循环。 我尝试在没有循环的情况下添加索引。仍然得到同样的错误。 "preg_replace(): Parameter mismatch . . . " 详细错误如下"'insert into estimate_details (estimate_id, item_id, item_description, units, rate, initial_amount, @987654329 @, created_at) 值 (89, ?, ?, ?, ?, ?, ?, ?)" 更改您的 html。删除最后一个索引,如 Form::select('item_id[][item_id]' => Form::select('item_id[]' item_description[][item_description] => item_description[] 干杯!现在在没有索引的循环中执行它。【参考方案2】:

要从多行中存储estimate detail,可以使用以下方法。

// 使用for循环准备所有数据的数组

$data = [];
for($i=0,$i<count($input['item_id']);$i++)

 $data[]= array ('item_id'=>$input[$i]['item_id'],
                 'item_description'=>$input[$i]['item_description']);
                 'units'=>$input[$i]['units']);
                 'rate'=>$input[$i]['rate']);
                 'initial_amount'=>$input[$i]['initial_amount']);


Model::insert($data); // Eloquent
DB::table('table')->insert($data); // Query Builder

【讨论】:

感谢您的回复。我尝试使用 Eloquent 和 Query Builder "EstimateDetail::insert($data);"和“DB::table('estimate_details')->insert($data);”但我得到“未定义的偏移量:0”。知道为什么会这样。 在插入之前,请确认您的 $data 数组不为空,并检查该数组创建循环。主要思想是从输入数据生成适当的数组。

以上是关于Laravel 将动态输入数据数组保存到数据库中的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 验证动态表单输入数据?

“数组到字符串的转换”错误 Laravel - 尝试将数组保存到数据库

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

如何将数组数据保存到 Laravel postgres 中?

如何将动态生成的 vuejs 数组发布到 mysql 数据库

PHP如何使用laravel 5将数据从数组保存到mysql