Julius Fasema
Julius Fasema

Reputation: 902

My recursive function in laravel does not call itself

I am writing a recursive function to call the child record from the parent record. It seems not to be working. i am getting this error; "Trying to get property 'refid' of non-object". Where am i getting it wrong. Please any idea? below is the code Snippet.

the function controller

public function DisplayDetail($id)
{
    $displayDetail = DB::table('tblmembers')
        ->where('refid',$id)
        ->get();
    return $this->DisplayDetail($displayDetail->refid);
}

main controller where the function is called

public function dashboard()
{ 

    $profile = DB::table('tblmembers')->where('username',$userid)->first();
    $data['userdetail'] = $this->DisplayDetail($profile->memid); 
    return view('main.userArea',$data);  
}

the blade where the record fetched is displayed

@foreach($userdetail as $userd)
    {{ $userd->memid }}
@endforeach

my sample data

refid   |   memid
-------------------
12345   |  123456
123456  |  1234567
123456  |  1234568
123456  |  1234569
1234567 |  1234570

from the above table; refid: 123456 brought memid: 1234567,1234568,1234569. then refid: 1234567 brought memid: 12345670

i want to display all the memid after login in as a user with memid 123456

Upvotes: 2

Views: 484

Answers (3)

Gaurav Gupta
Gaurav Gupta

Reputation: 1698

try this function

    public function DisplayDetail($id,$data=[])
    {

     $displayDetail = DB::table('tblmembers')
            ->where('refid',$id)
            ->get();
    if($displayDetail && isset($displayDetail->refid))// your condition for last child 
    {   
     $data = $this->DisplayDetail($displayDetail->refid,$data);
    }
     $data[] = array('refid' =>$displayDetail->id ,
                     'memid' => $displayDetail->secondid );
    return $data;
    }

i'll explain you later first modify according to your requirement and run

Upvotes: 0

party-ring
party-ring

Reputation: 1871

The error:

Trying to get property 'refid' of non-object

is occuring because your database query is using ->get(), which returns a Collection, rather than an object. You cannot get the property ->refid on a Collection, you can only get it from an object that resides in the collection.

As Lakhwinder Singh shows in his code, you need to use ->first(), as this will return one object. I would suggest using ->firstOrFail(), that way you will either get back an object which matches your ID, or it will fail if it cannot find it.

If you do:

$displayDetail = DB::table('tblmembers')
        ->where('refid',$id)
        ->firstOrFail();

You will now be able to call:

$displayDetail->refid

You can use that in your function call to displayDetail.

Upvotes: 0

Lakhwinder Singh
Lakhwinder Singh

Reputation: 5582

You are doing one thing wrong in your function DisplayDetail. Here the the correction in your function

If you want to get single item then here is the correct code.

public function displayDetail($id)
{
    $displayDetail = DB::table('tblmembers')
                       ->where('refid',$id)
                       ->first();
    if($displayDetail) {
         $displayDetail['userdetail'] = $this->displayDetail($displayDetail->refid);
    }
    return $displayDetail;
}

And dashboard function will be look like this

public function dashboard()
{ 
    $profile=DB::table('tblmembers')->where('username',$userid)->first();
    $userDetail = $this->DisplayDetail($profile->memid); 
    return view('main.userArea',[
        'userdetail' => $userDetail
    ]);
}

This is the correct code. Try this and let me know if you have another query on this.

Upvotes: 1

Related Questions