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 雄辩的关系多对一不起作用

Laravel 7雄辩的关系不起作用

为啥我在 Laravel 中简单的 belongsTo 关系不起作用?

Laravel Lighthouse Graphql HasOne 嵌套关系不起作用

为啥我的多对一 laravel 关系不起作用?

Laravel 一对多关系不起作用 - 返回递归