@phpcoder81

Как соединить работу двух методов?

Есть класс Customer
Метод create() создает запись о клиенте
Метод createContact() создает запись в таблице контактов. Контактов может быть несколько у одного клиента.

Тк запись добавляется из сразу и для первой и для второй таблицы (один контакт точно нужно сохранить, причем одним действием), то непонятно, как это реализовать в контроллере.

Единственное что пришло в голову, сделать так:

if(isset($_POST['create'])){
  try{
    $last_id = $customer->create($_POST); //метод возвращает новый номер записи
    if(!empty($last_id)){
      $customer->createContact($last_id, $_POST); //передаем его в метод добавления контакта
    }
  }catch(AppException $e){
		
  }
}


Может быть есть иные способы?

PS. пробовал также добавлять createContact внутрь create, внутри класса
  • Вопрос задан
  • 178 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
1. В контроллере ничего подобного в принципе никогда быть не должно. Ни двух методов, ни одного. Никакой работы с БД в контроллере в принципе быть не может. Контроллер должен только принять данный из формы и вызвать метод модели. Только не убогого класса для маппинга таблицы из БД в класс РНР, который называют моделью новички, а нормальной модели, реелизующей всю бизнес-логику приложения.
2. По-хорошему, это код для репозитория, поскольку он работает с базой данных. Но конкретная реализация зависит от того как реализован класс customer

В идеале цепочка вызовов должна быть такая
Контроллер вызывает инстанс хелпера (или сервиса) CustomerHelper.
В этот хелпер через конструктор передается инстанс CustomerRepository и присваивается свойству класса.
В методе Create класса CustomerHelper вызывается метод Create класса CustomerRepository.
И в этом методе уже и происходит искомая транзакция.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mad_maximus
@mad_maximus
Если добавляете сразу в 2 таблицы, то оберните в транзакцию и тогда вызываете один метод надежно
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы