Красноречивая модель с именем таблицы динамически устанавливает разрывы после постановки в очередь (Laravel 5.8) - PullRequest
0 голосов
/ 05 июля 2019

Я уже задаю динамическое имя таблицы для модели, но оно прерывается при постановке в очередь из-за сериализации модели.

Мне нужно, чтобы это значение сохранялось.

Мне нужно иметь возможность задавать задания в очереди, чтобы, учитывая имя таблицы, получать все строки в ней, обрабатывать их одну за другой до тех пор, пока не останется больше строк.Однако эта таблица может изменить свое имя, но не структуру, поэтому я использую модель для чтения / обновления каждой строки.

Однако я обнаружил, что ПОСЛЕ отправки задания в очередь, свойство таблицымодели возвращается к исходному, установленному в классе модели.

DataSource.php

class DataSource extends Model
{
    protected $table = '';
}

MyJob.php

public function processTable(string $table)
{
    $datasource = new DataSource();
    $datasource->setTable($table);
    logger('COUNT: '.$datasource->count());

    $datasource::chunk(3, function(...){
        ...
    });
}

Ввод пользователя: my_table

Тест до ::dispatch:

dump($datasource->getTable()) Шилдс my_table

dump('COUNT: '.$datasource->count()); экранирует правильные строкиcount

При выполнении задания очереди:

local.ERROR: SQLSTATE[42000]: Syntax error or access violation: 1103 Incorrect table name '' (SQL: select * from `` order by ``.`id` asc limit 3 offset 0)... 

Как видите, свойство $table модели пропускается при сериализации [de] модели в любой точкевремя после отправки в базу данных.

Я не совсем уверен в своей гипотезе.Мне нужно, чтобы кто-то подтвердил или исправил меня, если это действительно так.

Необходимость: сохранить правильное имя таблицы, которое будет обрабатываться заданием при извлечении из очереди.

1 Ответ

0 голосов
/ 12 июля 2019

Сохраняете ли вы свойство table в задании перед отправкой?Это необходимо для любых данных, которые вы хотите передать при использовании очереди.Следующий пример работал для меня.

/ App / Jobs / DataSourceJob.php

<?php

namespace App\Jobs;

use App\DataSource;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

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

    // this is where the table name will be stored
    protected $table;

    public function __construct($table)
    {
        // store the table name prior to entering queue
        $this->table = $table;
    }

    public function handle()
    {
        // retrieve the table name when the job runs
        $table = $this->table;

        $datasource = new DataSource();
        $datasource->setTable($table);
        logger('COUNT: '.$datasource->count());

        $datasource::chunk(3, function() {
            //
        });
    }
}

Проверьте это.

$table = '...';

dispatch(new DataSourceJob($table));
...