laravel-mongodb icon indicating copy to clipboard operation
laravel-mongodb copied to clipboard

Adding withCount in mongodb request I got Illegal offset type error

Open sergeynilov opened this issue 1 year ago • 1 comments

In laravel 9 with MongoDB(jenssegers/mongodb 3.9) I added withCount in request :

$subscription = Subscription
    ::getById($subscriptionId)
    ->withCount('userSubscriptions')
    ->firstOrFail();

and got error :

[2022-08-16 14:02:18] local.ERROR: Illegal offset type {"userId":"62fb9ff9f74eb576f803a7b2","exception":"[object] (TypeError(code: 0): Illegal offset type at Project/vendor/jenssegers/mongodb/src/Query/Builder.php:373)
[stacktrace]
#0 Project/vendor/jenssegers/mongodb/src/Query/Builder.php(201): Jenssegers\\Mongodb\\Query\\Builder->getFresh()
#1 Project/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(698): Jenssegers\\Mongodb\\Query\\Builder->get()
#2 Project/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(682): Illuminate\\Database\\Eloquent\\Builder->getModels()
#3 Project/vendor/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php(296): Illuminate\\Database\\Eloquent\\Builder->get()
#4 Project/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(582): Illuminate\\Database\\Eloquent\\Builder->first()
#5 Project/app/Http/Controllers/Admin/SubscriptionController.php(162): Illuminate\\Database\\Eloquent\\Builder->firstOrFail()
#6 Project/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\Admin\\SubscriptionController->edit()
#7 Project/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction()
#8 Project/vendor/laravel/framework/src/Illuminate/Routing/Route.php(261): Illuminate\\Routing\\ControllerDispatcher->dispatch()
#9 Project/vendor/laravel/framework/src/Illuminate/Routing/Route.php(204): Illuminate\\Routing\\Route->runController()
#10 Project/vendor/laravel/framework/src/Illuminate/Routing/Router.php(725): Illuminate\\Routing\\Route->run()

I tried to debug this error in src/Query/Builder.php file:

$columns = [];

// Convert select columns to simple projections.
\Log::info(varDump($this->columns, ' -1 $this->columns::'));
foreach ($this->columns as $column) {
    $columns[$column] = true; // THIS LINE RAISED ERROR 
}

I see in log file:

[2022-08-16 14:02:18] local.INFO: Array(2) : -1 $this->columns:: : Array
(
    [0] => subscriptions.*
    [1] => Illuminate\Database\Query\Expression Object
        (
            [value:protected] => (select "subscription_id" from "user_subscriptions" where "subscription_id" exists ?) as "user_subscriptions_count"
        )

)

Relation is set in app/Models/Subscription.php :

public function userSubscriptions()
{
    return $this->hasMany('App\Models\UserSubscription', 'subscription_id', '_id');
}

This relation is used in boot method :

protected static function boot()
{
    parent::boot();
    static::deleting(function ($subscription) {
        $subscription->userSubscriptions()->delete();
    });

}

and all related userSubscriptions are deleted ok. Error only on withCount.

How that can be fixed ?

Thanks!

sergeynilov avatar Aug 17 '22 15:08 sergeynilov