php - Laravel Eloquent 多对多如何添加到哪里?

标签 php laravel laravel-5

我定义了三个表,如下所示:

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/

相关文章:

php - Laravel 5 强制 HTTPS 问题,登录路由到 HTTP

php - 有限制地排队 Guzzle 请求

PHP 单选按钮获取两个值

laravel - dd() 在 vue-laravel 项目 axios 调用中不起作用。是否可以在 axios 调用中使用转储?

php - 一般错误 : 1364 Field 'user_id' doesn't have a default value

mysql - 拉维尔 : Migration with Foreign Key

laravel-5 - laravel 5.8 - 创建和更新用户的个人资料

PhpUnit 抛出捕获的异常

php - 从两个表中选择最新条目?

PHP 回显空白日期时间字段