Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

allw's avatar
Level 4

Blade @each causing trying to get property of non-object error (recursion)

I'm trying to loop out a tree using blade, but on what I presume is the last loop it is failing with non-object error.

@each('partials.faculties', $faculties, 'faculties')

...
//partials.faculties.blade.php
@foreach($faculties as $faculty)
    <b-card title="{{ $faculty->name }}"
      text-variant="white"
      bg-variant="{{ $faculty->safe_name }}"
      v-b-toggle="'HoF_{{ $faculty->safe_name }}'"
     class="mb-3 cursor-pointer">
</b-card>
@endforeach
@foreach($faculties as $faculty)
<b-collapse class="justify-content-center container-fluid mb-3" id="HoF_{{ $faculty->safe_name }}">
   <b-row>
    @if (count($faculty->children) > 0)
        @foreach($faculty->children as $faculties)
            @include('partials.faculties', $faculties)
        @endforeach
    @endif
   </b-row>
 </b-collapse>
@endforeach

I've tried multiple different variable names to see if they were being overridden and tried to follow a guide too but to no avail. Is there some other condition I am missing?

0 likes
29 replies
D9705996's avatar

My first question would be why are you doing two loops on faculties. Can you not do

foreach($faculties as $faculty)
    <b-card title="{{ $faculty->name }}"
      text-variant="white"
      bg-variant="{{ $faculty->safe_name }}"
      v-b-toggle="'HoF_{{ $faculty->safe_name }}'"
     class="mb-3 cursor-pointer">
</b-card>
<b-collapse class="justify-content-center container-fluid mb-3" id="HoF_{{ $faculty->safe_name }}">
   <b-row>
    @if (count($faculty->children) > 0)
        @foreach($faculty->children as $faculties)
            @include('partials.faculties', $faculties)
        @endforeach
    @endif
   </b-row>
 </b-collapse>

You are also reusing $faculties In the inner loop. Try changing

       foreach($faculty->children as $child)
            @include('partials.faculties', $child)
        @endforeach
sumbria's avatar
<b-card title="{{ $faculty->name }}"
      text-variant="white"
      bg-variant="{{ $faculty->safe_name }}"
      v-b-toggle="'HoF_{{ $faculty->safe_name }}'"
     class="mb-3 cursor-pointer">
</b-card>
<b-collapse class="justify-content-center container-fluid mb-3" id="HoF_{{ $faculty->safe_name }}">
   <b-row>
    @if (is_array($faculty->children) && count($faculty->children))
        @each('partials.faculties', $faculty->children, 'faculty')
    @endif
   </b-row>
 </b-collapse>
allw's avatar
Level 4

@D9705996 - I was using one loop before but the formatting was messed up...

also this is a recursive loop so surely I cannot just use $child when the foreach loop relies on $faculties?

sumbria's avatar

Can you please dd or print the $faculties and paste it here? @allw

kakimo's avatar

To avoid issues with variable scopes i would just do the recursive rendering of child views with @each instead of a @foreach and @include.

allw's avatar
Level 4

@SUMBRIA -

 [{"id":2,"name":"Science","is_subject":false,"short_name":null,"_lft":"2","_rgt":"21","parent_id":"1","safe_name":"science","children":[{"id":3,"name":"Chemistry","is_subject":true,"short_name":"Ch","_lft":"3","_rgt":"4","parent_id":"2","safe_name":"chemistry","children":[]},{"id":4,"name":"Physics","is_subject":true,"short_name":"Ph","_lft":"5","_rgt":"6","parent_id":"2","safe_name":"physics","children":[]},{"id":5,"name":"Biology","is_subject":true,"short_name":"Bi","_lft":"7","_rgt":"8","parent_id":"2","safe_name":"biology","children":[]},{"id":6,"name":"Dual Award Science","is_subject":true,"short_name":"Du","_lft":"9","_rgt":"16","parent_id":"2","safe_name":"dual-award-science","children":[{"id":7,"name":"Dual Award Biology","is_subject":false,"short_name":"DuB","_lft":"10","_rgt":"11","parent_id":"6","safe_name":"dual-award-biology","children":[]},{"id":8,"name":"Dual Award Chemistry","is_subject":false,"short_name":"DuC","_lft":"12","_rgt":"13","parent_id":"6","safe_name":"dual-award-chemistry","children":[]},{"id":9,"name":"Dual Award Physics","is_subject":false,"short_name":"DuP","_lft":"14","_rgt":"15","parent_id":"6","safe_name":"dual-award-physics","children":[]}]},{"id":10,"name":"KS3 Science","is_subject":true,"short_name":"Sc","_lft":"17","_rgt":"18","parent_id":"2","safe_name":"ks3-science","children":[]},{"id":11,"name":"Applied Science","is_subject":true,"short_name":"As","_lft":"19","_rgt":"20","parent_id":"2","safe_name":"applied-science","children":[]}]},{"id":15,"name":"Humanities","is_subject":false,"short_name":null,"_lft":"28","_rgt":"33","parent_id":"1","safe_name":"humanities","children":[{"id":16,"name":"Geography","is_subject":true,"short_name":"Gg","_lft":"29","_rgt":"30","parent_id":"15","safe_name":"geography","children":[]},{"id":17,"name":"History","is_subject":true,"short_name":"Hi","_lft":"31","_rgt":"32","parent_id":"15","safe_name":"history","children":[]}]}]

Here is the JSON response, as dd or Print_r would be massive.

sumbria's avatar

Try this:

@each('partials.faculties', $faculties, 'faculty')

partials.faculties.blade.php:

<b-card title="{{ $faculty->name }}"
      text-variant="white"
      bg-variant="{{ $faculty->safe_name }}"
      v-b-toggle="'HoF_{{ $faculty->safe_name }}'"
     class="mb-3 cursor-pointer">
</b-card>
<b-collapse class="justify-content-center container-fluid mb-3" id="HoF_{{ $faculty->safe_name }}">
   <b-row>
    @if (is_array($faculty->children) && count($faculty->children))
        @each('partials.faculties', $faculty->children, 'faculty')
    @endif
   </b-row>
 </b-collapse>
allw's avatar
Level 4

@SUMBRIA - I have done and I'm back to my original problem (before I posted here) of it is not looping out the child faculties...

sumbria's avatar

Did you changed:

@each('partials.faculties', $faculties, 'faculty')

Note: the last argument is faculty and remove @foreach($faculties as $faculty) from partials.faculties.blade.php

kakimo's avatar

Have you checked if it is really the last loop which is failing (since you write "presume")?

kakimo's avatar

Also please give us more infos.. What is the datatype of faculties? array or eloquent model? If it is eloquent model, did you use some package (for what seems to be a nested set implementiation of a tree structure) or is it your own solution?

allw's avatar
Level 4

@KAKIMO - How Would I check if it is the last loop that is failing?

$faculties is an eloquent model yes and the nested set is lazychaser/laravel-nestedset but surely if the children are present in the JSON response the nested set is not the issue?

kakimo's avatar

use $faculties->children->count() instead of count(.....)

allw's avatar
Level 4

So if I use what you posted there is no error it simply does not loop out the children,

if I use the last version I had the error is:

ErrorException thrown with message "Trying to get property of non-object (View: /tmp/partials.facultiesAyN0yk) (View: /tmp/partials.facultiesAyN0yk)"

Stacktrace:
#75 ErrorException in /mnt/a/git/tracking/storage/framework/views/8e26579695f0838317ebb0d406f8b09914ba69dc.php:3
#74 ErrorException in /mnt/a/git/tracking/storage/framework/views/8e26579695f0838317ebb0d406f8b09914ba69dc.php:3
#73 ErrorException in /mnt/a/git/tracking/storage/framework/views/8e26579695f0838317ebb0d406f8b09914ba69dc.php:3
#72 Illuminate\Foundation\Bootstrap\HandleExceptions:handleError in /mnt/a/git/tracking/storage/framework/views/8e26579695f0838317ebb0d406f8b09914ba69dc.php:3
#71 include in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php:43
#70 Illuminate\View\Engines\PhpEngine:evaluatePath in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php:59
#69 Illuminate\View\Engines\CompilerEngine:get in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/View/View.php:142
#68 Illuminate\View\View:getContents in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/View/View.php:125
#67 Illuminate\View\View:renderContents in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/View/View.php:90
#66 Illuminate\View\View:render in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/View/Factory.php:202
#65 Illuminate\View\Factory:renderEach in /mnt/a/git/tracking/storage/framework/views/5d178f2a62b4e33365c1095c15eedac9529688a7.php:53
#64 include in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php:43
#63 Illuminate\View\Engines\PhpEngine:evaluatePath in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php:59
#62 Illuminate\View\Engines\CompilerEngine:get in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/View/View.php:142
#61 Illuminate\View\View:getContents in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/View/View.php:125
#60 Illuminate\View\View:renderContents in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/View/View.php:90
#59 Illuminate\View\View:render in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Http/Response.php:42
#58 Illuminate\Http\Response:setContent in /mnt/a/git/tracking/vendor/symfony/http-foundation/Response.php:202
#57 Symfony\Component\HttpFoundation\Response:__construct in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Router.php:733
#56 Illuminate\Routing\Router:toResponse in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Router.php:705
#55 Illuminate\Routing\Router:prepareResponse in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Router.php:665
#54 Illuminate\Routing\Router:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:30
#53 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:41
#52 Illuminate\Routing\Middleware\SubstituteBindings:handle in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#51 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#50 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php:43
#49 Illuminate\Auth\Middleware\Authenticate:handle in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#48 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#47 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:68
#46 Illuminate\Foundation\Http\Middleware\VerifyCsrfToken:handle in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#45 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#44 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php:49
#43 Illuminate\View\Middleware\ShareErrorsFromSession:handle in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#42 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#41 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:63
#40 Illuminate\Session\Middleware\StartSession:handle in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#39 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#38 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php:37
#37 Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse:handle in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#36 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#35 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php:66
#34 Illuminate\Cookie\Middleware\EncryptCookies:handle in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#33 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#32 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:104
#31 Illuminate\Pipeline\Pipeline:then in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Router.php:667
#30 Illuminate\Routing\Router:runRouteWithinStack in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Router.php:642
#29 Illuminate\Routing\Router:runRoute in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Router.php:608
#28 Illuminate\Routing\Router:dispatchToRoute in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Router.php:597
#27 Illuminate\Routing\Router:dispatch in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:176
#26 Illuminate\Foundation\Http\Kernel:Illuminate\Foundation\Http\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:30
#25 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php:65
#24 Barryvdh\Debugbar\Middleware\InjectDebugbar:handle in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#23 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#22 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/beyondcode/laravel-view-xray/src/XrayMiddleware.php:34
#21 BeyondCode\ViewXray\XrayMiddleware:handle in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#20 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#19 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/fideloper/proxy/src/TrustProxies.php:57
#18 Fideloper\Proxy\TrustProxies:handle in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#17 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#16 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:31
#15 Illuminate\Foundation\Http\Middleware\TransformsRequest:handle in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#14 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#13 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:31
#12 Illuminate\Foundation\Http\Middleware\TransformsRequest:handle in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#11 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#10 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php:27
#9 Illuminate\Foundation\Http\Middleware\ValidatePostSize:handle in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#8 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#7 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php:62
#6 Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode:handle in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
#5 Illuminate\Pipeline\Pipeline:Illuminate\Pipeline\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
#4 Illuminate\Routing\Pipeline:Illuminate\Routing\{closure} in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:104
#3 Illuminate\Pipeline\Pipeline:then in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:151
#2 Illuminate\Foundation\Http\Kernel:sendRequestThroughRouter in /mnt/a/git/tracking/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:116
#1 Illuminate\Foundation\Http\Kernel:handle in /mnt/a/git/tracking/public/index.php:55
#0 require_once in /mnt/a/git/tracking/server.php:21
allw's avatar
Level 4

@KAKIMO - sorry but still makes no difference...most frustrating part of this is I don't know why it is throwing this error, at least if I knew that I could work on a solution.

sumbria's avatar

@allw the correct way to use @each is the one I posted the answer above because you are using @each so you don't need to run @foreach inside an each because @each already looping the $faculties. And by using @foreach you are looping something like this:

foreach($faculties as $faculty){
    foreach($faculties as $faculty){
    
    }
}
sumbria's avatar
sumbria
Best Answer
Level 5

Try this and see if the childern is looping:

<b-card title="{{ $faculty->name }}"
      text-variant="white"
      bg-variant="{{ $faculty->safe_name }}"
      v-b-toggle="'HoF_{{ $faculty->safe_name }}'"
     class="mb-3 cursor-pointer">
</b-card>
<b-collapse class="justify-content-center container-fluid mb-3" id="HoF_{{ $faculty->safe_name }}">
   <b-row>
        @each('partials.faculties', $faculty->children, 'faculty')
   </b-row>
 </b-collapse>
allw's avatar
Level 4

@SUMBRIA - yes I know and I am trying both @each('partials.faculties', $faculties, 'faculty') & @each('partials.faculties', $faculty->children, 'faculty')

and the two nested foreach loop and either way is not displaying the children...

allw's avatar
Level 4

@SUMBRIA - What did you do that was different? just remove the if statement?

sumbria's avatar

You can also check if there is any css display issue. Are you using vue? @allw

kakimo's avatar

To find the error i would restrict the loop e.g. try:

-only loop if parent_id ==1

-or only recursivly include the first child of every faculty instead of looping

-or for a start just do the main include and no recursion at all

Try to find a restriction where it acutally works with out an error,

Please or to participate in this conversation.