@lexstile

Можно ли упростить реализацию создания заказа на laravel 9?

Делаю метод создания заказа, вроде все работает, но перед глазами какое-то *овно.
Можно ли как-то упростить реализацию данного метода? (очень не нравятся циклы в цикле)
Но иначе тут, похоже, не сделать?
public function create(OrderCreateRequest $request, Project $project)
    {
        $order = $project->orders()->create($request->all());

        foreach ($request->get('dishes') as $dishe) {
            for ($i = 0; $i < $dishe['quantity']; $i++) {
                $order->dishes()->attach($dishe['id'], Arr::except($dishe, ['id']));
            }
        }
        
        return $this->baseJson(message: ResponseHelper::success(__('orders.messages.created')), status: 201);
    }

# OrderCreateRequest

    public function rules()
    {
        return [
            'table_id' => ['required', 'numeric', 'exists:tables,id',
                Rule::unique('orders')->where(function ($query) {
                    return $query->where('table_id', $this->table_id)->whereIn('status', [Order::NEW, Order::WORK, Order::PAID]);
                }),
            ],
            'dishes' => ['required', 'array', 'min:1'],
            'dishes.*.id' => [
                'required',
                'numeric',
                function ($attribute, $value, $fail) {
                    $exists = Dishe::where('id', $value)->whereHas('menu', function ($query) {
                        return $query->where('project_id', $this->project->id);
                    })->exists();

                    if (!$exists) {
                        $fail(__('validation.exists'));
                    }
                },
            ],
            'dishes.*.price' => ['required', 'numeric', 'between:0,1000000'],
            'dishes.*.quantity' => ['required', 'numeric', 'digits_between:1,99'],
            'dishes.*.comment' => ['nullable', 'string', 'min:1', 'max:255'],
        ];
    }
  • Вопрос задан
  • 126 просмотров
Решения вопроса 2
vfreelancer
@vfreelancer
php
можно без for. attach сразу массив. примеры https://stackoverflow.com/questions/23226802/larav...
Ответ написан
Adamos
@Adamos
Вообще-то единственное число от dishes - dish, а не dishe.
И добавлять блюда в таблицу совсем не обязательно через $order->attach.
Достаточно создавать их с полем order_id = $order->id, чтобы при выборке они зацепились.
Ну, а как создавать записи пакетом - думаю, вы либо знаете, либо легко нагуглите.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы