【问题标题】:Belongs to many get all rows (Laravel)属于许多获取所有行(Laravel)
【发布时间】:2016-01-21 05:00:22
【问题描述】:

我有一个用户模型和一个属性模型。用户有 3 个角色:管理员、经理和经纪人。管理员可以查看所有属性,而经理和经纪人只能查看分配给他们的属性。经理或经纪人可能有许多财产,而财产可能属于任意数量的经理和经纪人。这是我的用户模型中的properties 关系:

/**
 * Get all properties belonging to this user.
 *
 * @return [type]            [description]
 */
public function properties()
{
    if ($this->isAdmin()) {
        return Property::all();

    } elseif ($this->isManager() || $this->isBroker()) {
        return $this->belongsToMany('App\Property');

    }

    return null;
}

这非常适合检索所有属性,但如果我必须执行 select 或 where 语句,我只能在用户 不是 管理员的情况下这样做,因为当前代码返回整个 Collection如果用户是管理员。这使得该方法无法用于搜索功能和任何类型的约束。

显然,我不想在property_user 表中为每个属性和管理员创建记录,因为这会占用大量不必要的空间。但是,我不想在我的控制器中有额外的逻辑,如果用户是经理或经纪人,则只调用 properties 方法,如果用户是管理员,则执行自定义查询。

有什么方法可以返回包含每一行的Illuminate\Database\Eloquent\Relations\BelongsToMany?或者我仍然可以将查询链接到另一个 Laravel 对象?

【问题讨论】:

    标签: php mysql laravel laravel-5


    【解决方案1】:

    你会想要返回一个查询对象。

    public function properties()
    {
        if ($this->isAdmin()) {
            return Property::query();
        } elseif ($this->isManager() || $this->isBroker()) {
            return $this->belongsToMany('App\Property');
        }
    
        return null;
    }
    

    【讨论】:

    • 这给我带来了Non-static method Illuminate\Database\Eloquent\Model::newQuery() should not be called statically
    • 我很抱歉。这只是query 而不是newQuery。答案已更新。
    • 太棒了!完美运行。在发布这个问题后,我想到的另一种虽然有点骇人听闻的方式是返回一个新的 Property 实例,该实例也是可查询的。不过,您的方法要干净得多。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2017-11-05
    • 2020-09-10
    相关资源
    最近更新 更多