将函数放入队列但不加载关系数据 | 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 特征仅存储模型的键并在模型未序列化时从数据库重新加载模型,因此这可能不会加载您的关系。
这通常是一个很大的好处,因为您将在排队的作业实际运行时收到新数据,而不是计划作业时的数据。
无论如何,最好是:
- 在作业本身中加载作业所需的关系,而不是依赖它们的预加载。
或
- 将 属性 和联系人作为单独的依赖项传递给您的作业 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');
}
我需要生成用户及其相关数据的 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 特征仅存储模型的键并在模型未序列化时从数据库重新加载模型,因此这可能不会加载您的关系。
这通常是一个很大的好处,因为您将在排队的作业实际运行时收到新数据,而不是计划作业时的数据。
无论如何,最好是:
- 在作业本身中加载作业所需的关系,而不是依赖它们的预加载。
或
- 将 属性 和联系人作为单独的依赖项传递给您的作业 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');
}