Kir*_*edi 10 php laravel laravel-5.1
我正在尝试从其官方文档中学习laravel数据库队列.我已完成文档中给出的配置.
在这里我的工作:
<?php
namespace App\Jobs;
use App\SearchLog;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendTicket extends Job implements SelfHandling, ShouldQueue
{
use InteractsWithQueue, SerializesModels;
protected $log;
protected $searchLog = array();
public function __construct(SearchLog $log , $data = array())
{
$this->log = $log;
$this->searchLog = $data;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$this->log->create($this->searchLog);
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我这样打电话
public function store(Request $request)
{
$searchLog = array();
// searchLog contains the data to be inserted into database
$log = new SearchLog();
$this->dispatch(new SendTicket($log , $searchLog));
}
Run Code Online (Sandbox Code Playgroud)
当我运行时,php artisan queue:listen 我得到的错误就像
[Illuminate\Database\Eloquent\ModelNotFoundException]没有模型[App\SearchLog]的查询结果.
但是当我编辑这样的工作时
//only edited code
public function __construct($data = array())
{
$this->searchLog = $data;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
SearchLog::create($this->searchLog);
}
Run Code Online (Sandbox Code Playgroud)
当这样打电话的时候
public function store(Request $request)
{
$searchLog = array();
// searchLog contains the data to be inserted into database
$this->dispatch(new SendTicket($searchLog));
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,插入数据.
在这里,我的问题是:
Ron*_*nen 11
问题在于use Illuminate\Queue\SerializesModels;,它试图序列化SearchLog $log你传递给构造函数的param.由于您的模型尚未保存,因此它没有标识符.
根据Laravel文件:
如果排队作业在其构造函数中接受Eloquent模型,则只有模型的标识符将序列化到队列中.实际处理作业时,队列系统将自动从数据库中重新检索完整的模型实例.
解决方法是SerializesModels从Job类中删除您愿意保存模型的特征.
我遇到了同样的问题。
看来如果您想将模型推送到队列,则只有其 ID 才会保存在有效负载中。因此,如果您尚未保存模型,则它在处理程序中将不可用。
毕竟我在队列和雄辩模型部分的文档中找到了它。
为了解决这个问题,我看到了两种解决方案,第一个是确保您有一个持久的模型:
public function store(Request $request)
{
$searchLog = array();
// searchLog contains the data to be inserted into database
$log = new SearchLog();
//Save the Searchlog beforehand if it doesn't have any data constraints
$log->save();
//Dispatch the Job with the saved Model
$this->dispatch(new SendTicket($log , $searchLog));
}
Run Code Online (Sandbox Code Playgroud)
或者仅将完整的模型保存过程放入处理程序中,就像您在示例中所做的那样。
//Full saving/initializing is happening here
public function handle()
{
SearchLog::create($this->searchLog);
}
Run Code Online (Sandbox Code Playgroud)
就我而言,我必须在高性能过程中将模型保存到数据库中,因此我将其完全放入处理程序中,使我的过程不依赖于数据库保存速度。所以我会把它放在handle()函数中。
| 归档时间: |
|
| 查看次数: |
4029 次 |
| 最近记录: |