Laravel Eloquent用儿童保存物品

Jaz*_*zzy 9 php laravel eloquent

我想保存orderorder_items,但我没有真正找到在文档的任何支持这种使用情况.一个hasMany关系.

基本上有一张orders桌子id | user_id和一张order_items桌子id | order_id | product_id.

如何同时save()订购和使用一系列商品而无需循环遍历商品并单独保存?

这可能吗?

伪代码假设$items是一个数组:

$items = Session::get("cart.items");

$order = new Order;
$order->user_id = Auth::user()->id;
$order->order_items = $items;
$order->save();
Run Code Online (Sandbox Code Playgroud)

Jar*_*zyk 10

hasMany关系所需要的是saveMany或者createMany,取决于$items数组中的内容:

// array of attributes:
$items = [
  ['name'=>'item1','price'=>'price1'],
  ...
];

// then createMany:
$order->orderItems()->createMany($items);
Run Code Online (Sandbox Code Playgroud)

这将在Items表中创建新行.


// array of models:
$items = [
  Item::find($someId),
  Item::find($anotherId),
  // and/or newly instantiated:
  new Item(['name'=>'item1','price'=>'price1']),
  ...
];

// then createMany:
$order->orderItems()->saveMany($items);
Run Code Online (Sandbox Code Playgroud)

这将关联(保存)现有模型,并创建不存在的模型.


还要注意我使用camelCase关系名orderItems而不是你的order_items.这是一个重要的细节,因为Eloquent(Laravel v4)在处理关系(动态属性)时会在模型上查找camelCased方法.

//Order model
public function orderItems()
{
  return $this->hasMany(...);
}

$order->orderItems; // collection
$order->order_items; // collection as well

// --------------------
// BUT
public function order_items()
{
  return $this->hasMany(...);
}

$order->orderItems; // null
$order->order_items; // null

// the only way you can work with relation then, is explicitly use method like:
$order->order_items()->get(); 
Run Code Online (Sandbox Code Playgroud)