约束渴望加载查询范围

时间:2015-12-23 07:21:29

标签: php laravel eloquent relationships

我正在创建一个管理面板,我的数据库中有3个表:组,角色,用户。我在users表和roles表之间有很多关系。 没有解释此功能的laravel文档。

public function roles() {
    return $this->belongsToMany('App\Models\Role', 'user_roles');
}

我在groups表和users表之间有一对多的关系。

public function group() {
    return $this->belongsTo('App\Models\Group');
}

现在我想通过急切加载将过滤器应用于查询。有了这些,我想添加以下动态过滤器。

public function scopeStatus($query, $status = null) {
    // If status is empty then return the query itself
    if (is_null($status)) {
        return $query;
    }

    return $query->where('status', $status);
}

public function scopeRole($query, $role = null) {
// If role is empty then return the query itself
if (is_null($role)) {
    return $query;
}

return $query->where('role', $role);
}

public function scopeGroup($query, $group = null) {
    // If group is empty then return the query itself
    if (is_null($group)) {
       return $query;
    }

    return $query->where('group_id', $group);
}

这样我就可以进行一些查询,比如[状态和group_id只是用户表中的列]

$users = User::with([
    'roles' => function ($query) use ($request) {
        $query->role($request['role']);
    }, 

    'group' => function($query) use ($request) {
        $query->group($request['group']);
    }
])
    ->status($request['status'])
    ->paginate(20);

但这不起作用。我是通过AJAX请求执行此操作,并且已经测试了请求参数。这是我dd($request);时得到的。

array:3 [▼
  "group" => "1"
  "role" => "1"
  "status" => "1"
]

一切看起来都不错,但我总是接收并清空对象。请大家帮忙。

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。我已经意识到,通过急切加载,您无法在约束它们时添加范围。您必须在闭包或查询构建器中执行所有条件语句。

所以我的问题是所有的范围,但不需要状态。这是新代码:

<script>
    var x = document.getElementById("demo");
        function getLocation() {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(showPosition);
        } else {
        x.innerHTML = "Geolocation is not supported by this browser.";
        }
    }
    function showPosition(position) {
        x.innerHTML = "Latitude: " + position.coords.latitude + 
        "<br>Longitude: " + position.coords.longitude; 
    }
</script>