laravel - 如何使用 Eloquent 保存 OneToMany 关系
问题描述
我是 Laravel 堆栈的新手,目前正在使用 Lumen 和 Eloquent 开发一个 API。我需要将Order
模型与其OrderLine
s 一起保存。但是,它没有通过。你能告诉我怎么做吗?
以下是我的模型和控制器设置:
class Order extends Model {
public function orderLines() {
return $this->hasMany('App\OrderLine')
}
}
class OrderLine extends Model {
.....
}
//inside OrdersController method I'm trying to save Order with Order lines received from JSON body
public function create(Request $request)
{
$orderData = $this->validate($request, [
'store' => 'required',
......
'order_status' => 'bail|required|max:20',
'delivery_date' => 'nullable|date',
'customer_id' => 'nullable|numeric',
'order_lines.*.product_id' => 'bail|required|numeric',
'order_lines.*.description' => 'bail|required|max:80',
'order_lines.*.unit_price' => 'bail|required|numeric',
'order_lines.*.discount' => 'bail|required|numeric',
'order_lines.*']);
$order = new Order($orderData);
$order->push(); // This does not save and gives me an error
$order->refresh();
return response()->json($order);
}
//This is the json body provided in the request
{
"store" : "Some Store",
...
"order_lines" : [{
"product_id": 1,
"description": "TU001: Polka dots",
"unit_price": 1000,
"discount": 100,
"units": 2
},
{
"product_id": 2,
"description": "TU002: Polka dots",
"unit_price": 500,
"discount": 0,
"units": 1
}]
}
当我尝试使用save
方法单独保存订单而不使用订单行时,它可以工作。但是用OrderLine
s 它失败了。
有人可以告诉我如何做到这一点。我曾经在 CakePHP 中这样做,但不确定它是如何在 Eloquent 中完成的。
//使用更多信息编辑在生成的插入 sql 查询中,我看到orderLines
将其作为表中的一列Order
。因为它给出了一个数组到字符串的转换错误。但实际上插入orderLines
应该在一个单独的 sql 查询中。
解决方案
public function create(Request $request)
{
$this->validate($request, [
'store' => 'required',
......
'order_status' => 'bail|required|max:20',
'delivery_date' => 'nullable|date',
'customer_id' => 'nullable|numeric',
'order_lines.*.product_id' => 'bail|required|numeric',
'order_lines.*.description' => 'bail|required|max:80',
'order_lines.*.unit_price' => 'bail|required|numeric',
'order_lines.*.discount' => 'bail|required|numeric',
'order_lines.*'
]);
$order = new Order($request->except('order_lines'));
$order->save();
$order->orderLines()->createMany($request->input('order_lines'));
$order->load('order_lines'); //not sure that you need this line
return $order;
}
推荐阅读
- html - Bootstrap 4列未按预期对齐
- database - 我的模拟器不使用相同的数据库,如果我在不同的设备上安装我的应用程序也会发生这种情况?
- javascript - [React Native+Firebase]How do you traverse a nested javascript array of objects and print the lowest child. ? (Firebase+React Native)
- python - Self.X Python (OOP)
- python - Click font awesome button python & selenium
- python - 从另一个 python 文件中获取变量。无属性错误
- svg - How to use Viewbox to show server-generated SVG?
- ruby-on-rails - 如何从印象派的轨道上获取时间范围?
- javascript - 将 git 输出转换为 JSON 文件
- facebook - Facebook Thumbnail Opacity