我在 laravel 中的递归函数不调用自己
Posted
技术标签:
【中文标题】我在 laravel 中的递归函数不调用自己【英文标题】:My recursive function in laravel does not call itself 【发布时间】:2019-10-04 13:06:12 【问题描述】:我正在编写一个递归函数来从父记录中调用子记录。它似乎不起作用。我收到此错误; “试图获得非对象的属性'refid'”。我在哪里弄错了。请问有什么想法吗?下面是代码片段。
函数控制器
public function DisplayDetail($id)
$displayDetail = DB::table('tblmembers')
->where('refid',$id)
->get();
return $this->DisplayDetail($displayDetail->refid);
调用函数的主控制器
public function dashboard()
$profile = DB::table('tblmembers')->where('username',$userid)->first();
$data['userdetail'] = $this->DisplayDetail($profile->memid);
return view('main.userArea',$data);
显示获取记录的刀片
@foreach($userdetail as $userd)
$userd->memid
@endforeach
我的样本数据
refid | memid
-------------------
12345 | 123456
123456 | 1234567
123456 | 1234568
123456 | 1234569
1234567 | 1234570
从上表; refid: 123456 带来了 memid: 1234567,1234568,1234569。然后 refid: 1234567 带来 memid: 12345670
我想以 memid 123456 的用户身份登录后显示所有 memid
【问题讨论】:
两件事首先设置了一些条件何时停止,因为那是您在树的最后一点出现错误的地方,您没有任何 refid,所以给您第二个错误,您想从此函数返回什么? 我试过了,但是不行 你想从这个函数返回什么? 【参考方案1】:您在函数DisplayDetail
中做错了一件事。这是您函数中的更正
如果您想获得单个项目,那么这里是正确的代码。
public function displayDetail($id)
$displayDetail = DB::table('tblmembers')
->where('refid',$id)
->first();
if($displayDetail)
$displayDetail['userdetail'] = $this->displayDetail($displayDetail->refid);
return $displayDetail;
而dashboard功能会是这个样子
public function dashboard()
$profile=DB::table('tblmembers')->where('username',$userid)->first();
$userDetail = $this->DisplayDetail($profile->memid);
return view('main.userArea',[
'userdetail' => $userDetail
]);
这是正确的代码。试试这个,如果您对此有其他疑问,请告诉我。
【讨论】:
它不返回任何东西。它只是显示空白页 尝试在displayDetail
函数中调试..逻辑是正确的。只需检查您正在查询的id
的数据。
错误在这行代码:'$displayDetail['userdetail'] = $this->DisplayDetail($displayDetail->refid);'。它似乎没有返回任何东西
您能否提供一些响应数据样本。所以我可以了解你的实现。
我认为你做错了什么......因为函数DisplayDetail
第一次传递memid
但递归传递refid
。我认为在memid
或refid
两种情况下都必须传递相同的ID。如果我错了,请纠正。【参考方案2】:
错误:
试图获取非对象的属性“refid”
发生是因为您的数据库查询正在使用->get()
,它返回一个Collection,而不是一个对象。您无法在 Collection 上获取属性 ->refid
,您只能从位于该集合中的对象中获取它。
正如 Lakhwinder Singh 在他的代码中所示,您需要使用 ->first()
,因为这将返回一个对象。我建议使用->firstOrFail()
,这样你要么取回一个与你的 ID 匹配的对象,要么如果找不到它就会失败。
如果你这样做:
$displayDetail = DB::table('tblmembers')
->where('refid',$id)
->firstOrFail();
您现在可以拨打电话了:
$displayDetail->refid
您可以在对displayDetail
的函数调用中使用它。
【讨论】:
我使用了 firstOrFail() 但不工作。收到此错误:调用未定义的方法 Illuminate\Database\Query\Builder::firstOrFail()。同时,我如何使用 get() 显示信息,因为这是我想通过循环遍历子树来实现的。谢谢【参考方案3】:试试这个功能
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;
稍后我会解释你先根据你的要求修改并运行
【讨论】:
出现错误尝试在 ' $data[] = array('refid' =>$displayDetail->id , 'memid' => $displayDetail-> 处获取非对象的属性 'refid' secondid );' print_r with echo" "你的 displayDetail 它可能会返回你的数组。或者可能是空的以上是关于我在 laravel 中的递归函数不调用自己的主要内容,如果未能解决你的问题,请参考以下文章