我在laravel中的递归函数不调用自己

我在laravel中的递归函数不调用自己,laravel,controller,laravel-blade,Laravel,Controller,Laravel Blade,我正在编写一个递归函数,从父记录调用子记录。它似乎不起作用。我得到了这个错误;“正在尝试获取非对象的属性'refid'。我哪里弄错了。有什么想法吗?下面是代码片段 功能控制器 公共函数显示详细信息($id) { $displayDetail=DB::table('tblmembers') ->其中('refid',$id) ->get(); 返回$this->displaydail($displaydail->refid); } 调用函数的主控制器 公共功能仪表板() { $profile=

我正在编写一个递归函数,从父记录调用子记录。它似乎不起作用。我得到了这个错误;“正在尝试获取非对象的属性'refid'。我哪里弄错了。有什么想法吗?下面是代码片段

功能控制器

公共函数显示详细信息($id)
{
$displayDetail=DB::table('tblmembers')
->其中('refid',$id)
->get();
返回$this->displaydail($displaydail->refid);
}
调用函数的主控制器

公共功能仪表板()
{ 
$profile=DB::table('tblmembers')->其中('username',$userid)->first();
$data['userdetail']=$this->displaydeail($profile->memid);
返回视图('main.userArea',$data);
}
显示获取记录的刀片服务器

@foreach($userdetail作为$userd)
{{$userd->memid}
@endforeach
我的样本数据

refid   |   memid
-------------------
12345   |  123456
123456  |  1234567
123456  |  1234568
123456  |  1234569
1234567 |  1234570
从上表;refid:123456,memid:123456712345681234569。然后refid:1234567带来memid:12345670


我想在以memid 123456用户身份登录后显示所有memid您在函数中做了一件错误的事情
displaydeail
。这里是你函数中的修正

如果您想获得单个项目,那么下面是正确的代码

public function displayDetail($id)
{
    $displayDetail = DB::table('tblmembers')
                       ->where('refid',$id)
                       ->first();
    if($displayDetail) {
         $displayDetail['userdetail'] = $this->displayDetail($displayDetail->refid);
    }
    return $displayDetail;
}
仪表板功能将如下所示

public function dashboard()
{ 
    $profile=DB::table('tblmembers')->where('username',$userid)->first();
    $userDetail = $this->DisplayDetail($profile->memid); 
    return view('main.userArea',[
        'userdetail' => $userDetail
    ]);
}
这是正确的代码。请尝试此操作,如果您对此有其他疑问,请告诉我。

错误:

正在尝试获取非对象的属性“refid”

正在发生,因为您的数据库查询使用的是
->get()
,它返回的是,而不是对象。无法在集合上获取属性
->refid
,只能从驻留在集合中的对象获取该属性

正如Lakhwinder Singh在其代码中所示,您需要使用
->first()
,因为这将返回一个对象。我建议使用
->firstOrFail()
,这样你要么会得到一个与你的ID匹配的对象,要么如果找不到它就会失败

如果您这样做:

$displayDetail = DB::table('tblmembers')
        ->where('refid',$id)
        ->firstOrFail();
您现在可以拨打:

$displaydeail->refid

您可以在函数调用中使用它,以
displaydeail

尝试此函数

    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;
    }

稍后我将解释您首先根据您的要求进行修改并运行

两件事首先设置一些条件何时停止,因为这是您在树的最后一点处遇到错误的地方,您没有任何refid,所以请先给出错误,然后再给出您想要从该函数返回的内容?我已经尝试过,但没有处理您想要返回的内容从这个函数?它不返回任何东西。它只是显示空白页面,请尝试在
displaydeail
函数中调试。。逻辑是正确的。您只需要检查您正在查询的
id
数据。错误在这一行代码:'$displaydeail['userdetail']=$this->displaydeail($displaydeail->refid);'。它似乎没有返回任何东西。你能提供一些响应数据的样本吗。所以我可以了解你的实施情况。我认为你做错了什么。。因为对于函数
displaydeail
,您第一次传递
memid
,但在递归中,您传递的是
refid
。我认为在这两种情况下,您必须传递相同的id,
memid
refid
。如果我错了,请更正。我使用了firstOrFail()但不起作用。我收到此错误:调用undefined方法Illumb\Database\Query\Builder::firstOrFail()。同时,如何使用get()显示信息,因为我希望通过循环子树来实现这一点。感谢您尝试在“$data[]=array('refid'=>$displaydail->id,'memid'=>$displaydail->secondid);”处获取非对象的属性“refid”时出错使用echo“
”打印您的displayDetail,它可能会返回数组。或者可能是空的