2015-10-07 2 views
3

Я пытаюсь узнать очередь базы данных laravel из ее официальной документации. Я сделал конфигурацию, указанную в документации.Laravel 5.1 Нет результатов запроса для модели в очереди

Вот мои работы:

<?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);  
    } 

В моем контроллере я называю как этот

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)); 
} 

Когда я бегу php artisan queue:listen я получаю сообщение об ошибке, как

[Осветите \ 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); 
} 

И когда вызов от этого, как

public function store(Request $request) 
{ 
    $searchLog = array(); 
    // searchLog contains the data to be inserted into database 
    $this->dispatch(new SendTicket($searchLog)); 
} 

Он отлично работает и вставки данных.
Вот мой вопрос:

  1. Как отправить объект в очереди?
  2. Что является лучшим способом отправки данных в очередь, чтобы мы могли обрабатывать?
+0

Такое поведение Laravel было неожиданным для многих людей, так что я рад видеть, что там это связанный отчет об ошибке здесь: https://github.com/laravel/framework/issues/14526 – Ryan

ответ

0

Я столкнулся с тем же вопросом.

Кажется, что если вы хотите подтолкнуть модель к очереди, только ее идентификатор будет сохранен в полезной нагрузке. Поэтому, если вы еще не сохранили модель, она не будет доступна в обработчике.

В конце концов я нашел его в documentation в разделе «Очереди и яркие модели».

Чтобы решить эту проблему, я вижу два решения, во-первых, убедитесь, что у вас есть постоянный Model:

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)); 
} 

или поставить полную модель процесса Saving обработчику только, как вы в вашем примере.

//Full saving/initializing is happening here 
public function handle() 
{ 
    SearchLog::create($this->searchLog); 
} 

В моем случае я должен был сохранить модель в базе данных в высокой производительности процесса, поэтому я положил его полностью в обработчике, что мой процесс не зависел от скорости экономии дб. Поэтому я бы поставил его в функцию handle().

2

Проблема заключается в use Illuminate\Queue\SerializesModels;, которая пытается сериализовать параметр SearchLog $log, который вы передаете конструктору. Поскольку ваша модель еще не сохранена, она не имеет идентификатора.

Согласно Laravel документации:

Если в очереди задания принимает Красноречивую модель в своем конструкторе, только идентификатора для модели будет сериализовать на очередь. Когда задание фактически обрабатывается, система очереди автоматически повторно извлекает полный экземпляр модели из базы данных.

Обойти бы удалить SerializesModels черту из класса работы, которую вы готовы сохранить вашу модель.

+0

https://stackoverflow.com/a/42981667/470749 - связанный с этим вопрос, который мне помог. – Ryan

Смежные вопросы