Красноречивый ORM не работает четко в моей очереди Laravel

#php #laravel #eloquent #orm #queue

Вопрос:

Привет всем моим благодетелям ! Я столкнулся с серьезной проблемой на Laravel и застрял на несколько дней.

Прежде всего, я хочу вставить данные запроса в БД перед запросом API. После запроса и получения объекта ответа я хочу вставить данные ответа в БД.
однако возникла проблема с асинхронной очередью.
Когда я добавил метод dispatch() для вставки данных с использованием асинхронной очереди, возникла проблема с тем, что все данные должны быть вставлены как 1-е необработанное, но многие данные вставляются как 2-е, 3-е, 4-е raw

  ---- -------------- --------------- -------------- 
| id | request_data | response_data | updated_date |
 ---- -------------- --------------- -------------- 
| 1  | 'something'  | 'something'   | 16-09-2021   | => perfect data what i want !
| 2  |    (null)    | 'something'   | 16-09-2021   | => wrong data(request_data was not inserted)
| 3  | 'something'  |    (null)     | 16-09-2021   | => wrong data(response_data was not inserted)
| 4  | 'something'  |    (null)     |    (null)    | => wrong data(response_data and updated_date were not inserted)
 ---- -------------- --------------- -------------- 

 

Я полагаю, что очередь и красноречивый ORM не работают нормально, но мне действительно интересно, как это исправить.
Что я должен сделать ?
Спасибо вам за вашу поддержку!

ниже приведены исходные коды, соответствующие моей логике

-> Это метод, который дважды вызывает метод отправки для вставки данных запроса и данных ответа

     public function requestWithLog() {
        try {
            $logData = Logger::setLogData();

            SaveLog::dispatch($logData, true); // Insert Request Data before API request

            $response = self::request($reqType, $reqUrl, $headers, $formParams,  $hasFile,
                $callback, $reqOption, true);

            $logData = Logger::setAsLogData($response);
            SaveLog::dispatch($logData, false); // Insert response Data after API request
        } catch(Exception $e) {
            throw new Exception($e->getMessage());
        }
    }
 

-> Это реализация очереди

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

    private $logData;
    private $isLogInsert;

    public function __construct($logData, $isLogInsert)
    {
        $this->logData = $logData;
        $this->isLogInsert = $isLogInsert;
    }

    public function handle()
    {
        return Logger::log($this->logData, $this->isLogInsert);
    }
}
 

-> Это класс, который использует дескриптор реализации очереди>
Я использовал метод «updateOrCreate» для вставки/обновления, потому что я беспокоюсь, что вставленные/обновленные данные response_data будут быстрее, чем до вставки данных запроса, если я использую запрос обновления для данных ответа.

 class Logger {
    public static function log($logData, $isLogInsert) {
        try{
            if($isLogInsert) {
                TABLENAME::updateOrCreate(['id' => $logData['id']],   // PK or unique key for matching
                    [
                        'request_data' => $logData['request_data']
                ]);
            } else {
                TABLENAME::updateOrCreate(['id' => $logData['id']],   // PK or unique key for matching
                    [
                        'response_data' => $logData['response_data'],
                        'res_code' => $logData['res_code']
                ]);
            }
        } catch(Exception $e) {
            if($isLogInsert) self::delLastLogIdOfCache();
        }
    }