Laravel-通过另一个模型的功能过滤模型中的行

时间:2019-03-17 08:00:48

标签: mysql laravel model

我有一个项目模型和一个用户模型。 在用户模型中具有检查用户是否具有权限的功能:

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    public function hasPermission($permission){
        $code = Permission::where('name',$permission)->first()->id-1;
        $total = $this->group->permissions;
        return ($total & pow(2,$code));
    }
}

我正在尝试通过此功能过滤项目,例如:

Items::where('sell_price','>',0)->where('user.hasPermission','SellItems');

项目模型如下:

class Items extends Model
{

    public function user(){
        return $this->belongsTo('App\User');
    }
}

2 个答案:

答案 0 :(得分:0)

嗨,我认为您正在寻找whereHas方法: https://laravel.com/docs/5.8/eloquent-relationships#querying-relationship-existence

那应该可以让您启动并运行!

注释中提到的

示例(请注意,未对此进行测试):

Item::whereHas('user', function($q) use ($permission) {
    //your permission query here you can use $permission;
}

答案 1 :(得分:0)

hasPermission处于当前状态,该功能要求已获取模型才能正常工作,因此实际上不能用作查询。

不过,您可以尝试用SQL编写逻辑并在whereHas中使用它:

Items::where('sell_price','>',0)->whereHas('user', function ($query) {
    $query->join('permissions', \DB::raw('users.group|(permissions.id-1)'), '!=', '0')
           ->where('permission.name', 'SellItems');
});

希望这将获得与具有销售许可权的用户相关联的所有商品。