Делаю метод создания заказа, вроде все работает, но перед глазами какое-то *овно.
Можно ли как-то упростить реализацию данного метода? (очень не нравятся циклы в цикле)
Но иначе тут, похоже, не сделать?
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'],
];
}