Reputation: 601
I am very beginner in Laravel.
I have this code:
class User extends Authenticatable implements MustVerifyEmail
{
use Notifiable;
public static $roles = [];
protected $fillable = ['company_id', 'enable', 'name', 'surname', 'email', 'email_verified_at', 'password', 'counter', 'url_address', 'isCompany', 'isMailing', 'content', 'nip1', 'business1', 'phone1', 'street1', 'number1', 'postal_code1', 'city1', 'country_id1', 'provincial_id1', 'nip2', 'business2', 'phone2', 'street2', 'number2', 'postal_code2', 'city2', 'country_id2', 'provincial_id2', 'nip3', 'business3', 'phone3', 'street3', 'number3', 'postal_code3', 'city3', 'country_id3', 'provincial_id3', 'cash', 'lng', 'lat', 'enable_map', 'remember_token', 'created_at', 'updated_at', 'last_login_at', 'last_login_ip' ];
protected $hidden = [
'password', 'remember_token',
];
public function roles()
{
return $this->belongsToMany('App\Role');
}
public function mainRole()
{
return $this->hasOne('App\Role');
}
public function hasRole(array $roles)
{
foreach($roles as $role)
{
if(isset(self::$roles[$role]))
{
if(self::$roles[$role]) return true;
}
else
{
self::$roles[$role] = $this->roles()->where('name', $role)->exists();
if(self::$roles[$role]) return true;
}
}
return false;
}
}
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('company_id')->unsigned();
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
$table->boolean('enable')->default(0);
$table->string('name', 120)->nullable();
$table->string('surname', 120)->nullable();
$table->string('email', 120)->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->bigInteger('counter')->default(0);
$table->string('url_address', 160);
$table->boolean('isCompany')->default(0);
$table->boolean('isMailing')->default(0);
$table->text('content')->nullable();
$table->string('nip1', 12)->nullable();
$table->string('business1', 120)->nullable();
$table->string('phone1', 60)->nullable();
$table->string('street1', 150)->nullable();
$table->string('number1', 8)->nullable();
$table->string('postal_code1', 12)->nullable();
$table->string('city1', 100)->nullable();
$table->bigInteger('country_id1')->default(0);
$table->bigInteger('provincial_id1')->default(0);
$table->string('nip2', 12)->nullable();
$table->string('business2', 120)->nullable();
$table->string('phone2', 60)->nullable();
$table->string('street2', 150)->nullable();
$table->string('number2', 8)->nullable();
$table->string('postal_code2', 12)->nullable();
$table->string('city2', 100)->nullable();
$table->bigInteger('country_id2')->default(0);
$table->bigInteger('provincial_id2')->default(0);
$table->string('nip3', 12)->nullable();
$table->string('business3', 120)->nullable();
$table->string('phone3', 60)->nullable();
$table->string('street3', 150)->nullable();
$table->string('number3', 8)->nullable();
$table->string('postal_code3', 12)->nullable();
$table->string('city3', 100)->nullable();
$table->bigInteger('country_id3')->default(0);
$table->bigInteger('provincial_id3')->default(0);
$table->decimal('cash', 9, 2)->default(0);
$table->decimal('lng', 10, 8)->default(0);
$table->decimal('lat', 10, 8)->default(0);
$table->boolean('enable_map')->default(0);
$table->rememberToken();
$table->timestamps();
$table->engine = "InnoDB";
});
Schema::create('roles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->engine = "InnoDB";
});
Schema::create('role_user', function (Blueprint $table) {
$table->bigInteger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->bigInteger('role_id')->unsigned();
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->engine = "InnoDB";
});
and seed:
public function run()
{
DB::table('roles')->insert([
'name' => 'admin'
]);
DB::table('roles')->insert([
'name' => 'adminCompany'
]);
DB::table('roles')->insert([
'name' => 'receptionist'
]);
DB::table('roles')->insert([
'name' => 'user'
]);
}
I would like to display a list of users who have the ADMIN role.
I have this code:
public function showAdminList(string $query, string $sortColumn, string $sortMethod) {
return User::where('email', 'LIKE', '%' . $query . '%')->orWhere('id', 'LIKE', '%' . $query . '%')->orWhere('name', 'LIKE', '%' . $query . '%')->orWhere('surname', 'LIKE', '%' . $query . '%')->orderBy($sortColumn, $sortMethod)->paginate(25);
}
The above code shows me all the users I have in the database. How can I display only those users who have the ADMIN role?
Upvotes: 0
Views: 48
Reputation: 34
You can use a scope in your User class, something like this:
public function scopeIsAdmin($query)
{
return $query->whereHas('roles', function ($q) {
$q->where('name', "ADMIN");
});
}
Then you can add it to your query like so:
User::isAdmin();
You will have to make sure that you include your OR statements correctly:
return User::isAdmin()
->where(function ($q) use ($query, $sortColumn, $sortMethod) {
$q->where('email', 'LIKE', '%' . $query . '%')
->orWhere('id', 'LIKE', '%' . $query . '%')
->orWhere('name', 'LIKE', '%' . $query . '%')
->orWhere('surname', 'LIKE', '%' . $query . '%')
->orderBy($sortColumn, $sortMethod)->paginate(25);
})->paginate(25);
I have not tested the above code so you may need to alter it slightly.
In response to your second question, you can probably use a different scope:
public function scopeOfRoleType($query, $types)
{
return $query->whereHas('roles', function ($q) use ($types) {
$q->whereIn('name', $types);
});
}
and then do User::ofRoleType(['admin', 'receptionist])....
Upvotes: 1
Reputation: 1410
Check out querying relations in Laravel for "Querying Relationship Existence".
In your case, your User
model has many-to-many roles
relationship. If you want to select only those users who has certain role, you can query users
like this:
$role = 'receptionist';
$receptionists = User::whereHas('roles', function ($query) use ($role) {
$query->where('name', $role);
})->get();
So just add this whereHas()
call to your query and read $role
value from your request.
Upvotes: 1