Laravel Eloquent Artisan Tinker 上的方法链接

Laravel Eloquent Method Chaining on Artisan Tinker

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

users
- id
- role_id

roles
- id
- name

role_features
- id
- role_id
- feature_id

features
- id
- parent_id

featurestable上,我们可以看到有parent_id,也就是说有一个主要特征子特征

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

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

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

并且在获得 main-features 之后,我们是否可以做一个递归(或者其他方法)来提取它的 sub-features?
也许,像,

$main_features->sub

我已经在我的 Feature 模型上试过了,但是 return 出错

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 with message 'Method Illuminate/Database/Eloquent/Collection::main does not exist.'

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

$user->role->features

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

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

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


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

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

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

并且在获得 main-features 之后,我们是否可以做一个递归(或者其他方法)来提取它的 sub-features?
也许,像,

$main_features->sub

我真正想要实现的是,

  1. 一个函数/方法链接,我可以在 Artisan Tinker 和 Normal Code 中使用(像以前的链接一样,以呼应功能),所以我可以更轻松地在 Artisan Tinker 上进行测试。这可能吗?

  2. 是否可以将 method/function(mainsub)放在 [=67 上=]特征型号?因为,我认为,我会更容易维护代码。比如,"ohhh, this is related to Feature",那么,如果我需要做一些事情,我可以轻松导航 changes/adjustments。


提前致谢! :)


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

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

其中 return 子功能 ,我之前期待的。
至于现在,是否有可能,做 main 并且它仍然在 Feature 模型上?
所以,方法链可以做类似的事情,

$user->role->features->main


再次感谢!

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

你可以到这里 link。这是我在 Laracast 论坛上问同样问题的 link。


以防万一,link 已经死了/旧了,或者网站不知何故关闭或无法访问,这里是我的一小部分答案,可以帮助我解决这个特定的问题。

Have a look at this blog post by Tim MacDonald where he extends the collection class to create his own custom collections. https://timacdonald.me/giving-collections-a-voice/


感谢这个 User - Hanley,引导我找到答案! :)