Создание нового отношения "принадлежит" в 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. Для незнакомых - замена раскрывающегося списка, которая имеет возможность свободно вводить строку, которая используется для поиска существующих записей, и, если она не найдена, отправляет на сервер то, что ввел пользователь. Что-то вроде динамического раскрывающегося списка с возможностью поиска и добавления параметров пользователем.