Этот материал читал.
Но как показалось, React.memo можно было избежать.
{positions.map(({ id, name, ref, dishes }) => <Position ... />)}
export const Position = memo(({ ..., dishes, ... }) => {
.........
{dishes.map((item) => <Dish ... />}
.....
});
SELECT count(id) + 1
FROM orders
WHERE id < :currentId AND project_id = 2 AND created_at >= '2022-01-01'
Никакие гонки это не запутают. -- рабочая таблица
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
project_id INT,
project_number INT
);
-- опорная таблица для генерации номеров в разрезе проектов
CREATE TABLE generate_project_number (
project_id INT,
project_number INT AUTO_INCREMENT,
PRIMARY KEY (project_id, project_number)
) ENGINE = MyISAM;
-- триггер-генератор
CREATE TRIGGER generate_project_number
BEFORE INSERT ON orders
FOR EACH ROW
BEGIN
-- вставить хапись в опорную таблицу для генерации номера
INSERT INTO generate_project_number (project_id) VALUES (NEW.project_id);
-- вставить сгенерированный номер в рабочую таблицу
SET NEW.project_number = LAST_INSERT_ID();
-- почистить опорную таблицу от лишних записей
DELETE FROM generate_project_number
WHERE project_id = NEW.project_id
AND project_number < NEW.project_number;
END
...
$categoriesWithDishes = $menu
->categories()
->with('dishes')
->get();
public function destroy(OrderDish $orderDish)
{
$this->authorize('delete', $orderDish);
$orderDish->delete();
return back(303);
}
class OrderUpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize(): bool
{
return $this->order->canChangeStatus($this->get('status'))&&$this->order->canUpdate();
}
}
switch ($this->getMethod())
{
case 'PATCH':
return [
'table_id' => ['numeric', 'exists:tables,id'],
'user_id' => ['numeric', 'exists:users,id'],
'status' => ['string', 'in:'. Order::NEW.','.Order::WORK.','.Order::CLOSE.','.Order::PAID],
];
case 'PUT':
return [
'table_id' => ['required', 'numeric', 'exists:tables,id'],
'user_id' => ['required', 'numeric', 'exists:users,id'],
'status' => ['required', 'string', 'in:'. Order::NEW.','.Order::WORK.','.Order::CLOSE.','.Order::PAID],
];
}