【问题标题】:Code optimization and alternative method to handle this代码优化和处理此问题的替代方法
【发布时间】:2022-07-11 21:38:28
【问题描述】:
        $attributes = $request->validated();

    $worker = DB::transaction(function () use ($attributes) {
        $worker = Worker::create($attributes);
        $course = $worker->course()->create(['course_name' => $attributes['course_name']]);
        $media = $course->media()->create(["filename" => fileUpload($attributes['doc_file'], 'Course'),"filetype" => "pdf"]);
        $medical_data = $worker->medical_detail()->create(['expiry_date' => $attributes['expiry_date']]);
        $document = $worker->document()->create(['doc_name' => $attributes['doc_name']]);
    });
    return success(new WorkerResource($worker), __('Workers created successfully'));


 return [
        'first_name' => ['required', 'string'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:workers,email'],
        'last_name' => ['required', 'string'],
        'phone_number' => ['nullable', 'numeric'],
        'hourly_rate' => ['required', 'numeric'],
        'birth_date' => ['required','date'],
        'doc_file' => ['sometimes','file','mimes:jpeg,png,jpg,doc,docx,pdf,csv,xlsx'],
        'course_file' => ['sometimes','file','mimes:jpeg,png,jpg,doc,docx,pdf,csv,xlsx'],
        'medical_file' => ['sometimes','file','mimes:jpeg,png,jpg,doc,docx,pdf,csv,xlsx'],
        'course_name' => ['sometimes','string'],
        'doc_name' => ['sometimes','string'],
        'medical_name' => ['sometimes','string'],
        'expiry_date' => ['sometimes','date'],
    ];
}

。我正在这样工作。这是一个好习惯吗? media 与coursemedical_detaildocument 有许多多态关系。并且worker与coursemedical_detaildocument有一种关系。我在这里发现的问题是,如果缺少任何一个属性字段,它就会出错,如果课程创建失败,那么 media->course()-> 会出错吗?什么是更好的方法?这种方法会影响性能吗?来这里优化代码

【问题讨论】:

  • 这段代码看起来不完整,因为您显示的是返回部分,而不是顶部。另外,我不确定您为什么要像这样做那样放入返回数组。通常您应该创建一个 Request 对象,该对象又包含所有规则和消息。 laravel.com/docs/9.x/validation#creating-form-requests 此外,AFAIK、DB::transaction 不会从自身返回值。 $worker 可能为空/null。您可以在 DB::transaction() 的闭包内返回一个值,然后获取它,但在您的示例中,您似乎没有这样做。

标签: laravel database performance optimization eloquent


【解决方案1】:

你可以像这样使用try catch

DB::beginTransaction();

try {
    DB::insert(...);
    DB::insert(...);
    DB::insert(...);

    DB::commit();
    // all good
} catch (\Exception $e) {
    DB::rollback();
    // something went wrong
}

看看这个:

Laravel: Using try...catch with DB::transaction()


或者你可以使用optional helper:

$course = optional($worker->course())->create[];

查看这篇文章:

How does Laravel optional() work?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-30
    • 2012-05-23
    • 1970-01-01
    • 2020-09-10
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多