laravel-mongodb: Job Batching not Working
- Laravel-mongodb Version: v3.8.1
- PHP Version: 7.4.9
- Laravel Version: v8.15.0
- Database Driver & Version: jenssegers/mongodb v3.8.1
Description:
Trying to get property ‘id’ of non-object on vendor/laravel/framework/src/Illuminate/Bus/DatabaseBatchRepository.php:256
Steps to reproduce
- Just create the Bus like:
use App\Jobs\ProcessPodcast;
use App\Podcast;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;
use Throwable;
$batch = Bus::batch([
new ProcessPodcast(Podcast::find(1)),
new ProcessPodcast(Podcast::find(2)),
new ProcessPodcast(Podcast::find(3)),
new ProcessPodcast(Podcast::find(4)),
new ProcessPodcast(Podcast::find(5)),
])->then(function (Batch $batch) {
// All jobs completed successfully...
})->catch(function (Batch $batch, Throwable $e) {
// First batch job failure detected...
})->finally(function (Batch $batch) {
// The batch has finished executing...
})->dispatch();
Expected behaviour
in Illuminate\Bus\DatabaseBatchRepository::find
$batch = $this->connection->table($this->table)
->where('id', $batchId)
->first();
// $batch should be a object instead of array
if ($batch) {
// the error is trigger by this method "toBatch"
return $this->toBatch($batch);
}
protected function toBatch($batch)
{
return $this->factory->make(
$this,
$batch->id, // this $batch is a array and not a object
$batch->name,
(int) $batch->total_jobs,
(int) $batch->pending_jobs,
(int) $batch->failed_jobs,
json_decode($batch->failed_job_ids, true),
unserialize($batch->options),
CarbonImmutable::createFromTimestamp($batch->created_at),
$batch->cancelled_at ? CarbonImmutable::createFromTimestamp($batch->cancelled_at) : $batch->cancelled_at,
$batch->finished_at ? CarbonImmutable::createFromTimestamp($batch->finished_at) : $batch->finished_at
);
}
Actual behaviour
in Illuminate\Bus\DatabaseBatchRepository::find
$batch = $this->connection->table($this->table)
->where('id', $batchId)
->first();
// it returns a array and not a object
Thanks
About this issue
- Original URL
- State: open
- Created 4 years ago
- Comments: 16 (1 by maintainers)
I see a couple of problems using the default
DatabaseBatchRepository
class:id
for its primary key, but MongoDB uses_id
. This makes all queries onid
unindexedid
property to have no unique constraint unless people run a migration for that collection->table()
call uses a type map specifying arrays for root documents and embedded documents. This causes the issue of receiving an array when the repository expects an object. However, this is not something we can generally change.With that in mind, the solution will most likely involve creating a separate repository class that doesn’t have the issues mentioned above.
I’ve created PHPORM-81 to track this internally.
has this already been resolved?
Hi @stadeleon, in order to fix this issue this PR #1904 has to be merge