0

我目前正在学习Laravel Eloquent并尝试使用这种数据库结构在Artisan Tinker上进行测试

users
- id
- role_id

roles
- id
- name

role_features
- id
- role_id
- feature_id

features
- id
- parent_id

features表上,我们可以看到有parent_id,这意味着有一个main-featuressub-features

所以我的问题是,是否有可能做类似的事情,

$main_features = $user->role->features->main

(上面,我们假设,我们已经做了类似 User::find(1) 或其他的事情,以获取用户详细信息)

在获得main-features之后,我们是否可以使用递归(或其他方法)来提取其子功能
也许,像,

$main_features->子

我已经在我的Feature模型上尝试过这个,但它返回一个错误

public function main() {
    return $this->belongsTo('App\Feature', 'parent_id')
                    ->where(
                        function ($group_q) {
                            $group_q->whereNull('parent_id')
                                    ->orWhere('parent_id', 0);
                        })
                    ->with('main');
}

public function sub() {
    return $this->hasMany('App\Feature', 'parent_id')
                    ->with('sub');
}

带有消息的 BadMethodCallException 'Method Illuminate/Database/Eloquent/Collection::main 不存在。'

在那个错误之前,我可以做类似的事情,

$用户->角色->功能

获取该用户拥有的所有功能

我不太确定我需要什么google才能找到答案,因为我对 Laravel 术语并不十分熟悉。

顺便说一下,这是我之前尝试过的源参考

同一模型上的雄辩父子关系

在 laravel 5.8 中无法获取和显示动态菜单的孙关系


所以,再次,是否有可能做类似的事情,

$main_features = $user->role->features->main

(上面,我们假设,我们已经做了类似 User::find(1) 或其他的事情,以获取用户详细信息)

在获得main-features之后,我们是否可以使用递归(或其他方法)来提取其子功能
也许,像,

$main_features->子

我真正想要实现的是,

  1. 一个函数/方法链接,我可以在Artisan Tinker和 Normal Code 中使用(就像以前的链接一样,以呼应功能),因此我更容易在Artisan Tinker上进行测试。那可能吗?

  2. 是否可以将该方法/功能(mainsub)放在Feature模型上?因为,我认为,我更容易维护代码。比如,“哦,这与功能有关”,因此,如果我需要进行一些更改/调整,我可以轻松导航。


提前致谢!:)


更新
经过测试,我才意识到,可以这样做

$role->features->find(1)->sub

其中,将返回sub-features,这是我之前所期望的。
就目前而言,是否有可能做main并且它仍然在Feature模型上?
所以,方法链可以做类似的事情,

$用户->角色->功能->主要


再次感谢!

4

1 回答 1

0

对于那些在这个特定问题上寻求答案的人。

你可以去这里到这个链接。这是我在 Laracast 论坛上提出相同问题的链接。


以防万一,链接失效/旧或网站以某种方式关闭或无法访问,这是我回答的一小部分,导致我解决这个特定问题。

看看 Tim MacDonald 的这篇博客文章,他在其中扩展了集合类以创建自己的自定义集合。https://timacdonald.me/giving-collections-a-voice/


感谢这位用户 - Hanley,因为他引导我找到了答案!:)

于 2020-04-23T15:33:12.027 回答