Как сохранить отношения OneToMany с Eloquent - PullRequest
0 голосов
/ 11 декабря 2018

Я новичок в стеке Laravel и в настоящее время разрабатываю API с Lumen и Eloquent.У меня есть требование сохранить 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-запросе.

1 Ответ

0 голосов
/ 11 декабря 2018
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;
}
...