在 Laravel 中覆盖关系

Posted

技术标签:

【中文标题】在 Laravel 中覆盖关系【英文标题】:override relation in Laravel 【发布时间】:2014-10-05 11:53:42 【问题描述】:

我正在根据用户角色限制访问。

如果user->isAdmin() 返回true,我希望能够以某种方式覆盖belongsToMany 关系以返回全部。

目前有作为 AccountController 的索引方法:

public function index()

    if(Auth::user()->isAdmin())   // can this go in beforeFilter? 
        return Account::all();
    else
        return Auth::user()->accounts;

在我的用户模型中:

public function accounts()

    return $this->belongsToMany("Account");

有没有一种不需要在控制器函数中使用 if 语句的简洁方法?

【问题讨论】:

【参考方案1】:

你不能这样做。

关系方法必须返回Relation、otherwise it throws an error的实例。


没有什么能阻止你为此创建一个单独的方法:

AccountController.php

public function index()

    return Auth::user()->userAccounts();

用户.php

public function accounts()

    return $this->belongsToMany("Account");


public function userAccounts()

    if ($this->isAdmin()) return Account::all();

    return $this->accounts;

【讨论】:

以上是关于在 Laravel 中覆盖关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:覆盖包特征功能

使用 Laravel 将两个模型合并到一个分页查询中,并带有急切加载的关系

在 Laravel 容器中覆盖单例

扩展/覆盖 Laravel 验证器类

Laravel/Lumen 5.3.3:在迁移中覆盖 env 值

如何在代码覆盖率报告 Laravel 8 中覆盖异常?