Laravel - 自引用关系不起作用
Posted
技术标签:
【中文标题】Laravel - 自引用关系不起作用【英文标题】:Laravel - Self referential relationship does not work 【发布时间】:2021-02-25 07:04:37 【问题描述】:我使用 Laravel 8 在我的数据库中,我有一个包含以下数据的菜单表:
id | id_parent | name | route | routename | term | active
----------------------------------------------------------------------------------------
1 | NULL | "Home" | "/" | "home" | "main" | 1
2 | NULL | "Storage" | "/storage" | "storage" | "main" | 1
3 | 2 | "Devices" | "/storage/devices" | "storage.devices" | "main" | 1
4 | 2 | "New Device" | "/storage/new-device" | "storage.new-device" | "main" | 1
在我的菜单模型中,我有这个代码:
public function parent()
return $this->belongsTo('App\Models\Menu', 'id_parent');
public function children()
return $this->hasMany('App\Models\Menu', 'id_parent');
我的 Controller 中的函数如下所示:
static function getMenu($term)
$id_userrole = Auth::user()->id_userrole;
$route = \Request::route()->getName();
$menu = Menu::select('name','route','routename')
->with('children')
->where([['term',$term], ['active',1],['id_parent',null]])
->whereHas('access', function($q) use ($id_userrole)
$q->where('id_userrole', $id_userrole)
->orWhere('id_userrole', 0);
)
->get();
dump($menu);
foreach($menu as &$m)
$m->isActive = $route == $m->routename ? 1 : 0;
foreach($m->children as &$m2)
$m2->isActive = $route == $m2->routename ? 1 : 0;
$m->isActive = $m2->isActive;
return ApiResource::collection($menu);
如果我想生孩子,数组是空的。这是我的输出:
"data":["name":"Home","route":"\/","routename":"home","isActive":0,"children":[],"name":"Storage","route":"\/storage","routename":"storage","isActive":0,"children":[]]
我做错了什么?
【问题讨论】:
尝试在->get()
前添加->dd()
以输出实际的SQL查询。您还可以删除 whereHas('access')
和 API 资源以确保它们不是问题。
尝试在您的选择语句中包含id
列:Menu::select('id', 'name','route','routename')
;
【参考方案1】:
如果模型结果有id
列,children
关系将起作用,您可以这样测试:
Menu::with('children')->all();
顺便说一句,parent
关系应该是:
public function parent()
return $this->belongsTo('App\Models\Menu', 'id', 'id_parent');
如果你想得到孩子的孩子的孩子......
public function descendants()
return $this->children()->with('descendants');
【讨论】:
以上是关于Laravel - 自引用关系不起作用的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在 Laravel 中简单的 belongsTo 关系不起作用?