如何更新Laravel 5中的数组?

时间:2017-09-25 21:58:14

标签: php laravel-5

我很难找到一个合适的逻辑来在Laravel中更新这个数组。使用相同的逻辑,我可以创建但是我尝试更新它只会更新数组的最后一行。感谢

这是代码

public function update(Request $request, $id)
{

$invoice = Invoice::findOrFail($id);

$invoice->invoice_no = $request->invoice_no;
$invoice->client = $request->client;
$invoice->title = $request->title;
$invoice->client_address = $request->client_address;
$invoice->invoice_date = $request->invoice_date;
$invoice->due_date = $request->due_date;
$invoice->subtotal = $request->subtotal;
$invoice->grandtotal = $request->grandtotal;

$invoice->save();

$products = $request->all();


  $name = $products['name'];
  $price = $products['price'];
  $qty = $products['qty'];
  $total = $products['total'];

 foreach( $name as $key => $n) {

    $invoice->products()->update([ 

         //=> $invoice->id,
        'name' => $name[$key],
        'price' => $price[$key],
        'qty' => $qty[$key],
        'total' => $total[$key]
    ]);
 } 

这个确切的代码我可以创建并且工作正常但是如果我尝试更新它只更新数组中的最后一条记录。

数据库

Schema::create('invoices', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('invoice_no');
    $table->date('invoice_date');
    $table->date('due_date');
    $table->string('title');
    $table->string('client');
    $table->string('client_address');
    $table->decimal('subtotal');
    $table->decimal('grandtotal');
    $table->timestamps();
});

产品

Schema::create('products', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('invoice_id')->unsigned();
    $table->string('name');
    $table->string('qty');
    $table->string('price');
    $table->string('total');
    $table->timestamps();
});

关系

class Invoice extends Model {
protected $fillable =['client','client_address','title','invoice_no','invoice_date','due_date','discount', 'subtotal','grandtotal'];



public function products(){

return $this->hasMany('App\Product', 'invoice_id');
}


class Product extends Model
{

protected $casts = [
'name' => 'array',
'price' => 'array',
'qty' => 'array',
'total' => 'array'
];
protected $fillable = ['invoice_id','price','qty','total','name'];


public function invoice(){

return $this->belongsTo('App\Invoice');

}
}

array:13 [▼
"_token" => "RBtz42WyWeebnDTrSkhVhN2XC00f7MhyihI08lvA"
"invoice_no" => "1234"
"client" => "Denisson de Souza"
"title" => "owner"
"client_address" => "20/590 pine ridge road"
"invoice_date" => "2017-09-25"
"due_date" => "2017-09-30"
"name" => array:4 [▼
  0 => "11"
  1 => "22"
  2 => "33"
  3 => "44"
]
"price" => array:4 [▼
  0 => "32"
  1 => "32"
  2 => "32"
  3 => "32"
]
 "qty" => array:4 [▼
0 => "1"
1 => "2"
2 => "3"
3 => "4"
]
"total" => array:4 [▼
0 => "32"
1 => "64"
2 => "96"
3 => "128"
]
"subtotal" => "93.00"
"grandtotal" => "106.00"
]

1 个答案:

答案 0 :(得分:0)

以下内容应该有效:

在表单中添加另一个隐藏字段:

<input type="hidden" name="id[]" value="{{ $product->id }}">

然后用以下内容替换你的foreach循环:

$productObjs = Product::where('invoice_id', $invoice->id)->get(); 
foreach($productObjs as $prod){
    $key = array_search($prod->id, $products['id']);
    $prod->name = $name[$key];
    $prod->price = $price[$key];
    $prod->qty = $qty[$key];
    $prod->total = $total[$key];
    $prod->save();

}