1

我是 Laravel 的新手,不能完全理解表单请求以及如何使用它们。在简单的情况下,这很简单,但我需要的是在处理其余请求之前有条件地创建相关模型。让我解释。

//Job model
job_id PK
client_id
some_field

//Client model
client_id
external_id
name

现在在我的 Create Job 界面中,我有一个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 框。对于不熟悉的 - 一个下拉替换,它能够自由键入用于搜索现有记录的字符串,如果没有找到,它会将用户输入的内容发送到服务器。类似于具有搜索和添加选项功能的动态下拉列表由用户。

4

0 回答 0