Создание нового отношения "принадлежит" в Laravel с помощью запросов формы

Я новичок в Laravel и не могу осмыслить запросы формы и способы их использования. В простых случаях это достаточно просто, но мне нужно условное создание связанной модели, прежде чем продолжить выполнение остальной части запроса. Позволь мне объяснить.

//Job model
job_id PK
client_id
some_field

//Client model
client_id
external_id
name

Теперь в моем интерфейсе создания задания у меня есть Select2 поле со списком, которое использует AJAX для поиска в 2 разных источниках и получения 3 разных результатов.

Итак, скажем, я создаю новое задание и могу иметь POST, похожий на любой из этих:

Скрипт нашел клиента с id 21, мы просто хотим сохранить, все просто

'client_id' => 21
'some_filed' => Whatever

ИЛИ

Сценарий не нашел клиента, но мы выполнили поиск внешнего API и вернули этот идентификатор, который я затем могу проанализировать для создания нового клиента. Это нужно сделать до того, как я сохраню задание, так как мне нужно иметь для него client_id.

'client_id' => '196c3c7e34cde1d4593391ddf1901fd7'
'some_filed' => Whatever

ИЛИ

Скрипт не находит ни локального клиента, ни удаленной точки данных, поэтому мы хотим создать нового клиента, используя только указанное имя. Конечно, это должно произойти перед сохранением работы.

'client_id' => 'My new client name'
'some_filed' => Whatever

Где мне выполнить все эти функции?

Моим первым процедурным предположением было бы придерживаться $data['client_id'] = Client::HandleClientAndReturnId($data['client_id']) в StoreJob's validationData() перед возвратом результата.

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

Я использую запросы формы и на самом деле уже разбираю несколько моделей в запросе, но это HAS_ONEтипа отношений, поэтому я создаю их после Работы. Здесь мне нужно повернуть процесс вспять. Вот что у меня в контроллере, если это может пригодиться:

class JobController extends Controller
{
  public function store(StoreJob $request, StoreJobDataAdd $request_2, StoreJobDataSup $request_3)
  {
      $job = Job::create($request->validated());

      if ($_POST['add_on']) {
          $job->dataAdd()->create($request_2->validated());
      }

      if ($_POST['sup_on']) {
          $job->dataSup()->create($request_3->validated());
      }

      return new JsonResponse([
          'success' => true,
          'message' => __('New Job has been created.')
      ]);
  }
}

Вот мои отношения:

class Job extends Model 
{
  public function dataAdd()
  {
      return $this->hasOne(JobDataAdd::class, 'job_id', 'job_id');
  }

  public function dataSup()
  {
      return $this->hasOne(JobDataSup::class, 'job_id', 'job_id');
  }  

  public function client()
  {
      return $this->belongsTo(Client::class, 'contact_id', 'contact_id_client');
  }
}

У меня такое чувство, что я не понимаю, как это сделать, но не совсем уверен, где искать ответы, поэтому, пожалуйста, укажите мне правильное направление.

Уточнение:

Цель всего упражнения - позволить пользователям создавать новых клиентов или выбирать существующих с помощью одного поля со списком. Это поле Select2. Для незнакомых - замена раскрывающегося списка, которая имеет возможность свободно вводить строку, которая используется для поиска существующих записей, и, если она не найдена, отправляет на сервер то, что ввел пользователь. Что-то вроде динамического раскрывающегося списка с возможностью поиска и добавления параметров пользователем.

0 ответов

Другие вопросы по тегам