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

BelongsToMany can't filter fields

Open EfronC opened this issue 2 years ago • 1 comments

  • Laravel-mongodb Version: 8
  • PHP Version: 7.4
  • Database Driver & Version:

Description:

Full example in this SO question: https://stackoverflow.com/questions/69260901/jensseger-belongstomany-returns-nothing-when-selecting-fields

Created a BelongsToMany relationship, tried to filter related manytomany with $readingList = ReadingList::where('user_id', $user->id)->with("stories:title")->get();, and it launches "Invalid argument supplied for foreach()", debugged,and it seems that in BelongsToMany.php, at line 248 in function buildDictionary() it tries to access 'reading_list_ids' pivot array, but it doesn't exist so launches a null, causing the error. If i just remove ":title" from the line, it works perfectly, and $result contains {"_id":"6148dc2a23ef6d0e6838h123","title":"Lorem","blurb":"Ipsum","completed":"1"} at that point, so it doesn't seems just a matter of not having the field. Noy sure if this is a bug, or if there is a way to make this work somewhat.

Steps to reproduce

  1. Create BelongsToMany relationship.
  2. Get the relation with a with("model:field").
  3. Get the error.

Expected behaviour

Should return the data normally, with the related model having only the requested fields.

Actual behaviour

It launches Invalid argument supplied for foreach() error

Logs: local.ERROR: Invalid argument supplied for foreach() {"exception":"[object] (ErrorException(code: 0): Invalid argument supplied for foreach() at /var/www/vendor/jenssegers/mongodb/src/Relations/BelongsToMany.php:258) [stacktrace] #0 /var/www/vendor/jenssegers/mongodb/src/Relations/BelongsToMany.php(258): Laravel\\Lumen\\Application->Laravel\\Lumen\\Concerns\\{closure}(2, 'Invalid argumen...', '/var/www/vendor...', 258, Array) #1 /var/www/vendor/illuminate/database/Eloquent/Relations/BelongsToMany.php(276): Jenssegers\\Mongodb\\Relations\\BelongsToMany->buildDictionary(Object(Illuminate\\Database\\Eloquent\\Collection)) #2 /var/www/vendor/illuminate/database/Eloquent/Builder.php(649): Illuminate\\Database\\Eloquent\\Relations\\BelongsToMany->match(Array, Object(Illuminate\\Database\\Eloquent\\Collection), 'stories') #3 /var/www/vendor/illuminate/database/Eloquent/Builder.php(619): Illuminate\\Database\\Eloquent\\Builder->eagerLoadRelation(Array, 'stories', Object(Closure)) #4 /var/www/vendor/illuminate/database/Eloquent/Builder.php(587): Illuminate\\Database\\Eloquent\\Builder->eagerLoadRelations(Array) #5 /var/www/app/Http/Controllers/ReadingListController.php(138): Illuminate\\Database\\Eloquent\\Builder->get() #6 /var/www/vendor/illuminate/container/BoundMethod.php(36): App\\Http\\Controllers\\ReadingListController->listReadingLists() #7 /var/www/vendor/illuminate/container/Util.php(40): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}() #8 /var/www/vendor/illuminate/container/BoundMethod.php(93): Illuminate\\Container\\Util::unwrapIfClosure(Object(Closure)) #9 /var/www/vendor/illuminate/container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod(Object(Laravel\\Lumen\\Application), Array, Object(Closure)) #10 /var/www/vendor/illuminate/container/Container.php(651): Illuminate\\Container\\BoundMethod::call(Object(Laravel\\Lumen\\Application), Array, Array, NULL) #11 /var/www/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php(386): Illuminate\\Container\\Container->call(Array, Array) #12 /var/www/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php(352): Laravel\\Lumen\\Application->callControllerCallable(Array, Array) #13 /var/www/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php(326): Laravel\\Lumen\\Application->callLumenController(Object(App\\Http\\Controllers\\ReadingListController), 'listReadingList...', Array) #14 /var/www/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php(279): Laravel\\Lumen\\Application->callControllerAction(Array) #15 /var/www/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php(259): Laravel\\Lumen\\Application->callActionOnArrayBasedRoute(Array) #16 /var/www/vendor/laravel/lumen-framework/src/Routing/Pipeline.php(48): Laravel\\Lumen\\Application->Laravel\\Lumen\\Concerns\\{closure}(Object(Laravel\\Lumen\\Http\\Request)) #17 /var/www/app/Http/Middleware/Authenticate.php(71): Laravel\\Lumen\\Routing\\Pipeline->Laravel\\Lumen\\Routing\\{closure}(Object(Laravel\\Lumen\\Http\\Request)) #18 /var/www/vendor/illuminate/pipeline/Pipeline.php(167): App\\Http\\Middleware\\Authenticate->handle(Object(Laravel\\Lumen\\Http\\Request), Object(Closure)) #19 /var/www/vendor/laravel/lumen-framework/src/Routing/Pipeline.php(30): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Laravel\\Lumen\\Http\\Request)) #20 /var/www/vendor/illuminate/pipeline/Pipeline.php(103): Laravel\\Lumen\\Routing\\Pipeline->Laravel\\Lumen\\Routing\\{closure}(Object(Laravel\\Lumen\\Http\\Request)) #21 /var/www/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php(423): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) #22 /var/www/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php(260): Laravel\\Lumen\\Application->sendThroughPipeline(Array, Object(Closure)) #23 /var/www/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php(166): Laravel\\Lumen\\Application->handleFoundRoute(Array) #24 /var/www/vendor/laravel/lumen-framework/src/Routing/Pipeline.php(48): Laravel\\Lumen\\Application->Laravel\\Lumen\\Concerns\\{closure}(Object(Laravel\\Lumen\\Http\\Request)) #25 /var/www/app/Http/Middleware/CorsMiddleware.php(29): Laravel\\Lumen\\Routing\\Pipeline->Laravel\\Lumen\\Routing\\{closure}(Object(Laravel\\Lumen\\Http\\Request)) #26 /var/www/vendor/illuminate/pipeline/Pipeline.php(167): App\\Http\\Middleware\\CorsMiddleware->handle(Object(Laravel\\Lumen\\Http\\Request), Object(Closure)) #27 /var/www/vendor/laravel/lumen-framework/src/Routing/Pipeline.php(30): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Laravel\\Lumen\\Http\\Request)) #28 /var/www/vendor/illuminate/pipeline/Pipeline.php(103): Laravel\\Lumen\\Routing\\Pipeline->Laravel\\Lumen\\Routing\\{closure}(Object(Laravel\\Lumen\\Http\\Request)) #29 /var/www/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php(423): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) #30 /var/www/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php(172): Laravel\\Lumen\\Application->sendThroughPipeline(Array, Object(Closure)) #31 /var/www/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php(109): Laravel\\Lumen\\Application->dispatch(NULL) #32 /var/www/public/index.php(28): Laravel\\Lumen\\Application->run() #33 {main} "}

EfronC avatar Sep 20 '21 23:09 EfronC

same is happening to me. any news?

lbrutti avatar Apr 14 '23 14:04 lbrutti