Laravel Eloquent исключить конкретный результат из запроса ownToMany () - PullRequest
0 голосов
/ 09 ноября 2018

На модели User.php у меня следующие отношения:

public function roles()
{
    return $this->belongsToMany(Role::class);
}

В базе данных у меня разные роли, и в основном я хочу вернуть все роли, кроме роли "superadmin", чтобы ее нельзя было отобразить в представлениях или там, где я выберу показ роли.

Я пробовал что-то вроде:

public function roles()
{
    return $this->belongsToMany(Role::class)->where('name', '!=', 'superadmin');
}

... но это не работает. Я предполагаю, что это как-то связано с сводной таблицей. Я также попробовал это:

public function roles()
{
    return $this->belongsToMany(Role::class)->where('role_id, '!=', $id);
}

Есть идеи, как это сделать или вообще возможно?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Для тех, кто заинтересован, вот как я решил это. Спасибо пользователю eResourcesInc за идею. Однако я решил сделать это немного проще, поэтому я добавил область непосредственно в модель Role.php, вместо того, чтобы создавать отдельный файл php и использовать его. Вот так:

public function scopeExclude($query, $role)
{
    return $query->where('name', '!=', $role);
}

Затем, всякий раз, когда мне нужно получить роли, я могу теперь исключить любую роль, которую я хочу, и просто получить другие, как это:

$roles = Role::exclude('superadmin')->get();

Еще раз большое спасибо за идею!

0 голосов
/ 09 ноября 2018

Вы должны попробовать использовать Scope на модели Roles.

Вы можете создать область действия с именем DisplayRole, которая в основном возвращает все роли, которые не включают в себя superadmin и могут отображаться для пользователя. Это будет выглядеть примерно так:

namespace App;

use Illuminate\Database\Eloquent\Model;

class DisplayRole extends Role
{
    public function newQuery($excludeDeleted = true)
    {
        return parent::newQuery($excludeDeleted)->where('name','!=','superadmin');
    }
}

Тогда вы можете просто использовать DisplayRole так же, как вы обычно используете модель (используйте App \ DisplayRole), и в любом месте, где вам нужно показывать только удобные для пользователя роли, используйте эту модель вместо базовой модели ролей. Таким образом, вызов DisplayRole :: all () вернет все роли, которые не являются суперадминами.

...