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