admin管理员组文章数量:1335442
Create and update are working properly, but when I try to delete, the queue job always return fails. When I check the failed_jobs table, I see an exception
Illuminate\Database\Eloquent\ModelNotFoundException: No query results for model [App\Models\Spbu]
this is my observer code
class SpbuObserver
{
/**
* Handle the Spbu "created" event.
*/
public function created(Spbu $spbu): void
{
SyncSpbu::dispatch($spbu, 'create');
}
/**
* Handle the Spbu "updated" event.
*/
public function updated(Spbu $spbu): void
{
SyncSpbu::dispatch($spbu, 'update');
}
/**
* Handle the Spbu "deleted" event.
*/
public function deleted(Spbu $spbu): void
{
SyncSpbu::dispatch($spbu, 'delete');
}
/**
* Handle the Spbu "restored" event.
*/
public function restored(Spbu $spbu): void
{
//
}
/**
* Handle the Spbu "force deleted" event.
*/
public function forceDeleted(Spbu $spbu): void
{
//
}
}
and this my job code
class SyncSpbu implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable;
protected $spbu;
protected $action;
/**
* Create a new job instance.
* @param Spbu $spbu
* @param string $action (create|update|delete)
*/
public function __construct(Spbu $spbu, string $action)
{
$this->spbu = $spbu;
$this->action = $action;
}
/**
* Execute the job.
*/
public function handle()
{
$tenants = Tenant::all();
foreach ($tenants as $tenant) {
tenancy()->initialize($tenant);
try {
switch ($this->action) {
case 'create':
case 'update':
$tenantSpbu = TenantSpbu::updateOrCreate(
['id' => $this->spbu->id],
[
'id' => $this->spbu->id,
'nama' => $this->spbu->nama,
'alamat' => $this->spbu->alamat,
'latitude' => $this->spbu->latitude,
'longitude' => $this->spbu->longitude,
]
);
break;
case 'delete':
TenantSpbu::find($this->spbu->id)->delete();
break;
}
} catch (\Exception $e) {
Log::error("Error syncing SPBU to tenant {$tenant->id}: " . $e->getMessage());
}
tenancy()->end();
}
}
}
I am using multi-tenant Laravel. I want the data in the central domain to be synchronized across all tenants whenever it is updated or created. However, the issue is that when I try to delete data, the queue job fails.
Create and update are working properly, but when I try to delete, the queue job always return fails. When I check the failed_jobs table, I see an exception
Illuminate\Database\Eloquent\ModelNotFoundException: No query results for model [App\Models\Spbu]
this is my observer code
class SpbuObserver
{
/**
* Handle the Spbu "created" event.
*/
public function created(Spbu $spbu): void
{
SyncSpbu::dispatch($spbu, 'create');
}
/**
* Handle the Spbu "updated" event.
*/
public function updated(Spbu $spbu): void
{
SyncSpbu::dispatch($spbu, 'update');
}
/**
* Handle the Spbu "deleted" event.
*/
public function deleted(Spbu $spbu): void
{
SyncSpbu::dispatch($spbu, 'delete');
}
/**
* Handle the Spbu "restored" event.
*/
public function restored(Spbu $spbu): void
{
//
}
/**
* Handle the Spbu "force deleted" event.
*/
public function forceDeleted(Spbu $spbu): void
{
//
}
}
and this my job code
class SyncSpbu implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable;
protected $spbu;
protected $action;
/**
* Create a new job instance.
* @param Spbu $spbu
* @param string $action (create|update|delete)
*/
public function __construct(Spbu $spbu, string $action)
{
$this->spbu = $spbu;
$this->action = $action;
}
/**
* Execute the job.
*/
public function handle()
{
$tenants = Tenant::all();
foreach ($tenants as $tenant) {
tenancy()->initialize($tenant);
try {
switch ($this->action) {
case 'create':
case 'update':
$tenantSpbu = TenantSpbu::updateOrCreate(
['id' => $this->spbu->id],
[
'id' => $this->spbu->id,
'nama' => $this->spbu->nama,
'alamat' => $this->spbu->alamat,
'latitude' => $this->spbu->latitude,
'longitude' => $this->spbu->longitude,
]
);
break;
case 'delete':
TenantSpbu::find($this->spbu->id)->delete();
break;
}
} catch (\Exception $e) {
Log::error("Error syncing SPBU to tenant {$tenant->id}: " . $e->getMessage());
}
tenancy()->end();
}
}
}
I am using multi-tenant Laravel. I want the data in the central domain to be synchronized across all tenants whenever it is updated or created. However, the issue is that when I try to delete data, the queue job fails.
Share Improve this question asked Nov 20, 2024 at 6:17 Ardhan NovealdioArdhan Novealdio 131 silver badge2 bronze badges1 Answer
Reset to default 0Once your 'deleted' event gets triggered the model is already gone. Hence the model not found error because you are deleting the model and then passing it into the job constructor.
You can solve this by passing the id (assuming the id is the same for all tenants) of your model and retrieving the model in the job itself.
Documentation:
When injecting an Eloquent model into a job, the model is automatically serialized before being placed on the queue and re-retrieved from the database when the job is processed. However, if the model has been deleted while the job was waiting to be processed by a worker, your job may fail with a ModelNotFoundException.
https://laravel/docs/11.x/queues#ignoring-missing-models
本文标签: phpNo query results for model AppModelsSpbu when delete in observerStack Overflow
版权声明:本文标题:php - No query results for model [AppModelsSpbu] when delete in observer - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1742377436a2463442.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论