Laravel - Фильтровать строки из модели по функции другой модели - PullRequest
1 голос
/ 17 марта 2019

У меня есть модель предметов и модель пользователей.В пользовательской модели есть функция, которая проверяет, есть ли у пользователя разрешение:

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 голосов
/ 17 марта 2019

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');
});

Мы надеемся получить все элементы, связанные с пользователем, у которого есть разрешения на продажу.

0 голосов
/ 17 марта 2019

Привет, я думаю, что вы ищете метод 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...