0

我正在使用 Laravel 5.4 队列。我想在几秒钟后阅读 Excel 并在数据库中输入该记录。

$queue = Queue::later(10,'LogMsg', app('App\Http\Controllers\getFileController')->myfunc($name));
 return $queue;

这是我的调用函数,首先我可以这样通过吗?

public function myfunc($name)  {
    $f_data = Excel::load('public/invoices/'.$name, function($reader) {
        })->get();     
    if(!empty($f_data) && $f_data->count()){
           foreach ($f_data as $key => $row){                          
                  $inv = new final_tables;
                  foreach ($row as $key1 => $col){
                        $inv->$key1 = $row->$key1;
                  }
                  $inv->save();
           }
      }
     return 'done';
}
4

1 回答 1

1

我认为您真正想要做的是异步处理 excel,您可以编写一个作业类来做同样的事情。作业类可以从控制器函数中分派,并将在后台运行。

具有相同功能的示例作业如下所示:

class ReadExcelAndSaveRecordsToDB implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $filePath;

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

   /**
    * Execute the job.
    *
    * @return void
    */
    public function handle()
    {
        $fileData = Excel::load($this->filePath, function($reader) {
        })->get();

        //Whatever you want to do with the file here, for eg. create a DB entry
        return 'done';
    }
}

现在您可以像这样从控制器函数中分派相同的作业:

use Carbon\Carbon;


public function someControllerAction(Request $request)
{
    $filePath = //Save file and obtain filepath

    $job = (new ReadExcelAndSaveRecordsToDB($filePath))
                ->delay(Carbon::now()->addMinutes(10));

    dispatch($job);
}

那应该为你做。

于 2017-06-08T18:49:13.540 回答