在Codeigniter中,我使用模型中的函数来获取关联数组中的导航(我可以轻松地迭代并渲染菜单),如下所示
public function getMenuItems()
{
$st=$this->db->select('*')->from('admin_menu')->where('parent',0)->get()->result_array();
if(count($st)>0)
{
for($i=0;$i<count($st);$i++)
{
$st[$i]['child']=$this->db->select('*')->from('admin_menu')->where('parent',$st[$i]['id'])->get()->result_array();
}
}
else
{
return false;
}
return $st;
}
它给了我一个像这样的数组
Array
(
[menu] => Array
(
[0] => Array
(
[id] => 1
[name] => Users
[class] => icon icon-users
[url] =>
[parent] => 0
[child] => Array
(
[0] => Array
(
[id] => 2
[name] => Add
[class] =>
[url] => admin/add_user
[parent] => 1
)
[1] => Array
(
[id] => 3
[name] => Manage
[class] =>
[url] => admin/manage_users
[parent] => 1
)
)
)
)
)
多么甜蜜。现在在Laravel 5.2中,我创建了一个模型adminNav以及Migration,admin_nav表的相同数据库模式。在我的Controller的索引函数中,我使用了以下代码
public function index($name=NULL)
{
$adminNav=new adminNav();
$navs=$adminNav->all();
$parents=$adminNav->WHERE('parent',0)->get();
for($i=0;$i<count($parents);$i++)
{
$child=$adminNav->WHERE('parent',$parents[$i]['id'])->get()->toArray();
$parents[$i]['child']=$child;
}
return View('partials.form',[
'navs'=>$navs,
'parents'=>$parents,
]);
}
我受到一大堆参数的惩罚,我还没准备好像这样
Illuminate\Database\Eloquent\Collection Object
(
[items:protected] => Array
(
[0] => App\adminNav Object
(
[connection:protected] =>
[table:protected] =>
[primaryKey:protected] => id
[keyType:protected] => int
[perPage:protected] => 15
[incrementing] => 1
[timestamps] => 1
[attributes:protected] => Array
(
[id] => 1
[parent] => 0
[name] => Users
[url] =>
[updated_at] => 2017-03-04 05:47:07
[created_at] => 2017-03-04 05:47:07
[child] => Array
(
[0] => Array
(
[id] => 6
[parent] => 1
[name] => Add
[url] => adminController/add_user
[updated_at] => 2017-03-04 09:26:26
[created_at] => 2017-03-04 09:26:26
)
[1] => Array
(
[id] => 7
[parent] => 1
[name] => Manage
[url] => adminController/manage_users
[updated_at] => 2017-03-04 09:29:16
[created_at] => 2017-03-04 09:29:16
)
)
)
请注意,我使用toArray()函数来获取Child并且它完美地运行并且在子索引处给我一个简单的数组但是当我在获取这样的父母时尝试使用相同的函数
$parents=$adminNav->WHERE('parent',0)->get()->toArray();
它给了我一个错误
如何在Array而不是Object中获取结果,或者我是否提出了错误的问题?
答案 0 :(得分:1)
在您的AdminNav
模型中为自己添加hasMany
关系,该关系描述了它的孩子。
public function children() {
return $this->hasMany(AdminNav::class, 'parent', 'id');
}
您必须添加范围才能从模型中仅获取父导航。
public function scopeRoot($query) {
return $query->where('parent', 0);
}
然后在您的代码中,您只需使用AdminNav::with('children')->root()->get()->toArray()
尚未测试过,但我想它会起作用。
答案 1 :(得分:1)
要在Laravel中获得类似链接的查询,您可以这样做:
public function getMenuItems()
{
$st = DB::table('admin_menu')->where('parent', 0)->get()->toArray();
if (count($st) < 1) {
return false;
}
for ($i = 0; $i < count($st); $i++) {
$st[$i]['child'] = DB::table('admin_menu')->where('parent', $st[$i]['id'])->get()->toArray();
}
return $st;
}
或者
public function getMenuItems()
{
$st = DB::table('admin_menu')->where('parent', 0)->get()
->map(function ($item) {
$item->child = DB::table('admin_menu')->where('parent', $item['id'])->get()->toArray();
return $item;
})->toArray();
return count($st) ? $st : false;
}
话虽如此,我建议使用@Mithredate答案,因为它会更有效,更容易编写。
希望这有帮助!