我正在尝试使用Laravel创建一个简单的购物应用程序,我使用LaravelShoppingCart插件在用户会话中存储项目。当用户点击我的store
方法时,应存储order
和order_line
条记录。
我目前使用以下代码收到此错误:
参数1传递给Illuminate \ Database \ Eloquent \ Model :: __ construct() 必须是类型数组,给定对象,调用 /home/vagrant/site/app/Http/Controllers/BasketController.php在线 130并定义
表架构:
// create orders table
Schema::create('orders', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned()->nullable();
$table->foreign('user_id')->references('id')->on('users');
$table->text('order_notes')->nullable();
$table->decimal('subtotal', 5, 2)->default(0);
$table->timestamps();
});
// create order lines table
Schema::create('order_lines', function (Blueprint $table) {
$table->increments('id');
$table->integer('order_id')->unsigned();
$table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade');
$table->integer('menu_item_id')->unsigned();
$table->foreign('menu_item_id')->references('id')->on('menu_item');
$table->decimal('sale_price', 5, 2);
$table->integer('quantity');
$table->timestamps();
});
订单型号(关系):
/**
* Define relationship to OrderLines
* @return [type] [description]
*/
public function order_line()
{
return $this->hasMany('App\OrderLine');
}
OrderLine模型(关系):
public function order()
{
return $this->belongsTo('App\Order');
}
商店功能:
public function store(CreateOrderGuestRequest $request)
{
$order = new Order;
$order->order_notes = $request->order_notes;
$order->save();
$order_lines = new Collection();
foreach (Cart::content() as $row) {
$order_lines->push([
'menu_item_id' => $row->id,
'quanity' => $row->qty,
'sale_price' => $row->price
]);
}
$order->order_line()->saveMany(new OrderLine($order_lines));
// redirect somewhere after
}
答案 0 :(得分:3)
你非常接近。您只需进行一些调整即可实现此功能。您需要将模型集合或模型数组传递给saveMany
方法,因此当您循环而不是“推送”数组时,“推送”一个新的OrderLine模型,如下所示:
foreach (Cart::content() as $row) {
$order_lines->push(
new OrderLine([
'menu_item_id' => $row->id,
'quanity' => $row->qty,
'sale_price' => $row->price
])
);
}
然后,当您致电saveMany
时,只需传递$order_lines
集合;
$order->order_line()->saveMany($order_lines);
当然,这是假设Cart::content()
有效。
在相关说明中:saveMany
不会使用单个查询插入所有条目。它将循环并逐个添加它们。要使用单个查询执行批量插入,您需要使用查询构建器。
编辑:如何使用查询构建器使用insert
方法的示例:
$order_lines = [];
foreach (Cart::content() as $row) {
$order_lines[] = [
'menu_item_id' => $row->id,
'quanity' => $row->qty,
'sale_price' => $row->price,
'order_id' => $order->id
];
}
DB::table('order_lines')->insert($order_lines);
您只需构建一个数据数组即可插入表中并插入。