将函数放入队列但不加载关系数据 | Laravel 队列

Put function in Queue but not loaded relation data | Laravel Queue

我需要生成用户及其相关数据的 pdf。我在控制器中创建了一个函数来生成 pdf(使用 snappy-pdf 包)。数据加载正确,pdf 生成并成功上传到 S3。现在我试图将该函数与用户数据一起放入队列中。但是没有为生成 pdf 加载数据。相反,它只加载用户模型数据,而不加载相关数据(如 属性 和联系人)。

$user = User::where("id", 83)->with(['property', 'contacts'])->first();
$contact_list = [];
if(count($user->contacts)){
    foreach ($user->contacts as $contact) {
        array_push($contact_list, $contact->contactDetails->name);
    }
} 
$user->contact_list = $contact_list;
return view('pdf_view', ["user" => $user]);
if($request->has('download')) {

    // dispatch the event
    /*$pdf = PDF::loadView('pdf_view', ["user" => $user]);
            // upload pdf
        Storage::disk('s3')->put("user-invoice/user.pdf", $pdf->output(), 'public');*/
    dispatch(new GenerateSignedDocument($user));
    return "done";         
}

这是我的工作文件。

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Log;
use PDF;
use Storage;

class GenerateSignedDocument implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    private $user;
    public function __construct($user)
    {
        $this->user = $user;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
         // Log::info('Showing user: '.$this->user);
        $pdf = PDF::loadView('pdf_view', ["user" => $this->user]);
            // upload pdf
        Storage::disk('s3')->put("user-invoice/user.pdf", $pdf->output(), 'public');
    }
}

SerializesModels 特征仅存储模型的键并在模型未序列化时从数据库重新加载模型,因此这可能不会加载您的关系。

这通常是一个很大的好处,因为您将在排队的作业实际运行时收到新数据,而不是计划作业时的数据。

无论如何,最好是:

  1. 在作业本身中加载作业所需的关系,而不是依赖它们的预加载。

  1. 将 属性 和联系人作为单独的依赖项传递给您的作业 class。

我不知道这是否是完美的解决方案,但我这样做并且工作正常。 我在处理程序函数中调用了执行 pdf 生成所需的函数 (uploadUserDocument)。

/**
 * Execute the job.
 *
 * @return void
 */
public function handle()
{
    app('App\Http\Controllers\UserController')->uploadUserDocument($this->user_id);
}

并按控制器中的原样发送事件

dispatch(new GenerateSignedDocument(83));

并将生成pdf所需的代码放入uploadUserDocument函数中,如下所示。

/**
     * Function is used to Save document to s3 cloud
     * @param $user_id
     * @return Response
     */
    public function uploadUserDocument($user_id){
        $pdf = PDF::loadView('pdf_view', ["user" => $user]);
            // upload pdf
        Storage::disk('s3')->put("user-invoice/user.pdf", $pdf->output(), 'public');
    }