我定义了三个表,如下所示:
CREATE TABLE `roles` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `roles_title_index` (`title`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `users_email_unique` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `role_user` (
`role_id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned NOT NULL,
KEY `role_user_user_id_foreign` (`user_id`),
KEY `role_user_role_id_foreign` (`role_id`),
CONSTRAINT `role_user_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE,
CONSTRAINT `role_user_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
我有两个类(class):
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Roles of the user
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function roles()
{
return $this->belongsToMany('App\Models\Role', 'role_user', 'user_id', 'role_id');
}
}
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
/**
* Returns users for role
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function users()
{
return $this->belongsToMany('App\Models\User', 'role_user', 'role_id', 'user_id');
}
}
现在我如何根据用户类方法中的标题过滤角色? 我想我可能需要以某种方式修改它:
$this->roles()->getResults();
所以,假设我需要一种方法来获得用户类中的特定角色
最佳答案
怎么样:
class User extends Model {
// find all users having the given title
public static function withTitle($title) {
return static::whereHas('roles', function ($q) use ($title) {
$q->where('title', $title);
})->get();
}
// determine if this particular user has the given title
public function hasRoleByTitle($title) {
$roles = $this->roles()->where('title', $title)->get();
return 0 < count($roles);
}
}
用法示例:
var_dump(User::withTitle('admin'));
$user = new User(242);
var_dump($user->hasRoleByTitle('admin'));
未经测试,不在 L5 环境附近。但应该在大致范围内!
关于php - Laravel Eloquent 多对多如何添加到哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32456092/