Логика создания контрагента и одновременно заказа

Помогите, плиз, разобраться как правильно логику определить: Чтобы создать карточку заказа, нужно прикрепить к нему клиента (он может быть повторным или новым). У меня в голове только одно - сначала создаем клиента (или выбираем повторного из базы данных) и потом создаем заказ. Можно ли как то объединить эти два этапа?


Ответы (1 шт):

Автор решения: phpBear

Без структуры БД это конечно гадание на кофейной гуще, но все же попробую. Предположим у Вас вот такая структура БД

-- справочник заказов
CREATE TABLE orders (
  id bigint not null auto_increment,
  name varchar(255)
  ...
);
-- справочник клиентов
CREATE TABLE clients (
  id bigint not null auto_increment,
  name varchar(255) not null,
  jur_address varchar(255),
  real_address varchar(255),
  ...
);
-- связка заказов с клиентами (один-ко-многим)
CREATE TABLE lnk_client_orders (
  id bigint not null auto_increment,
  client_id bigint int not null,
  order_id bigint int not null,
  ...
);

Предположим создали Вы заказ. Теперь его нужно как-то связать с клиентом - но Вы его не знаете, до тех пор пока не создадите или не получите из БД. Все как Вы и описали. Тут выхода два:

  1. Традиционный - создаем заказ, запоминаем ИД, создаем/получаем клиента - запоминаем ИД. Связываем эти два ИД через таблицу связку.
  2. Пишем на стороне БД процедуру create_order в которую передаем данные о заказе и клиенте - и она уже внутри себя сама решает - что создать или получить и как связать.
CREATE PROCEDURE create_order 
(
   order_name varchar(255),
   client_id bigint,
   client_name varchar(255),
   ...
) 
BEGIN 
   DECLARE order_id bigint;
   INSERT INTO orders (name) VALUES(order_name);
   SELECT INTO @order_id LAST_INSERT_ID();
   --  если указан client_id получаем о нем информацию (проверяем что такая запись есть)
   -- если он не указан - создаем нового клиента, получаем ID
   -- по аналогии с order_id и связываем клиента и заказ путем
   -- INSERT в таблицу-связку
END; 

На мой взгляд предпочтительней второй вариант т.к он решает за Вас большую часть проблем с проверками - плюс его реализация скрыта под капотом, что не позволит в случае чур меня - взлома сайта - понять как и что у Вас формируется, и соответственно, что-то накрутить в заказах.

→ Ссылка