【问题标题】:Laravel Eloquent Method Chaining on Artisan TinkerLaravel Eloquent Method Chaining on Artisan Tinker
【发布时间】:2023-03-21 06:21:01
【问题描述】:

我目前正在学习 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,表示有ma​​in-features和sub-features

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

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

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

在获得ma​​in-features之后,我们是否可以使用递归(或其他方法)来提取其sub-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');
}

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

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

$user->角色->功能

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

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

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

Eloquent Parent-Child relationship on same model

Unable to get and display grandchild relationship for dynamic menu in laravel 5.8


那么,再次,是否有可能做类似的事情,

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

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

在获得ma​​in-features之后,我们是否可以使用递归(或其他方法)来提取其sub-features?
也许,像,

$main_features->子

我真正想要实现的是,

  1. 一个函数/方法链接,我可以在 Artisan Tinker 和普通代码中使用(像以前的链接一样,以呼应功能),所以我更容易测试工匠修补匠。这可能吗?

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


提前致谢! :)


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

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

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

$user->role->features->main


再次感谢!

【问题讨论】:

  • 作曲家转储-自动加载
  • @phpdroid 对不起,伙计,我能知道你为什么这么建议吗?对不起,如果我问这个,你是不是在错误的线程上?我相信,composer dump-autoload 对此案没有影响。另外,我通常会重新输入php artisan tinker,所以它会加载当前的模型代码。

标签: php laravel eloquent laravel-7 tinker


【解决方案1】:

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

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


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

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


感谢User - Hanley,因为它引导我找到答案! :)

【讨论】:

    猜你喜欢
    • 2018-03-29
    • 1970-01-01
    • 2016-06-19
    • 2023-03-08
    • 2013-10-09
    • 2016-03-24
    • 2013-08-27
    • 2019-10-24
    相关资源
    最近更新 更多