首页 文章

写信与Eloquent ORM / Laravel有很多关系

提问于
浏览
1

关于Laravel的雄辩ORM的问题 . 我已经看过SO了,如果我错过了类似的问题,我会道歉 .

我有一个User模型,我正在尝试通过User模型中的关系将一组权限写回UserPermissions模型 .

我已经设置了hasMany链接,并且可以从User对象( $user->roles )中检索正确的数据,但如果可能的话,无法解决如何回写的问题 .

这是我的基本用户模型:

class User extends Eloquent {

    protected $table = 'users';

    public $timestamps = false;

    protected function roles() {

        return $this->hasMany('UserPermission');

    }

}

和UserPermission模型:

class UserPermission extends Eloquent {

    protected $table = 'users_permissions';

    public $timestamps = false;

    protected $fillable = ['role_id', 'user_id'];

}

在这个阶段,我已经恢复保存用户,然后运行 UserPermission::insert() ,它允许传递一个数组,但如果可能的话,我宁愿一步完成 .

任何人都知道这是否可行?

谢谢!


UPDATE

表格结构如下:

用户表

+------------------+------------------+------+-----+---------+----------------+
| Field            | Type             | Null | Key | Default | Extra          |
+------------------+------------------+------+-----+---------+----------------+
| id               | int(10) unsigned | NO   | PRI | 0       | auto_increment |
| username         | varchar(255)     | NO   |     |         |                |
+------------------+------------------+------+-----+---------+----------------+

users_roles表

+------------------+------------------+------+-----+---------+----------------+
| Field            | Type             | Null | Key | Default | Extra          |
+------------------+------------------+------+-----+---------+----------------+
| id               | int(10) unsigned | NO   | PRI | 0       | auto_increment |
| name             | varchar(255)     | NO   |     |         |                |
| description      | varchar(255)     | YES  |     | NULL    |                |
| url_access       | varchar(255)     | NO   |     |         |                |
+------------------+------------------+------+-----+---------+----------------+

users_permissions表

+------------------+------------------+------+-----+---------+----------------+
| Field            | Type             | Null | Key | Default | Extra          |
+------------------+------------------+------+-----+---------+----------------+
| id               | int(10) unsigned | NO   | PRI | 0       | auto_increment |
| role_id          | int(10) unsigned | NO   |     |         |                |
| user_id          | int(10) unsigned | NO   |     |         |                |
+------------------+------------------+------+-----+---------+----------------+

role_idusers_roles.id 有关, user_idusers.id 有关

作为背景逻辑, users_roles 表有一个 url_access 列,其中包含一个url . 如果为该角色分配了用户,则他们可以访问该URL中的子页面 .

3 回答

  • 0

    我真的不明白你为什么使用 hasMany 关系而不是 belongsToMany . 实际上,您的数据库结构似乎已经被Laravel中的belongsToMany关系所使用 .

    我的解决方案

    User.php

    <?php
    
    class User extends Eloquent {  
    
      public function roles() {
        return $this->belongsToMany('Role');
      }
    
      protected $table = 'users';
      protected $guarded = array('id', 'password');
    }
    

    Role.php

    <?php
    
    class Role extends Eloquent {
    
    public function users()
      {
      return $this->belongsToMany('User');
      }
    
    protected $table = 'roles';
    protected $guarded = array('id');
    

    }

    相应的数据库表应为: usersrolesrole_user . 这些都符合Laravel的命名惯例,以便简单易懂 .

    现在您可以调用 sync 方法并将数组传递给它:

    $user->roles()->sync(array(1, 2, 3));
    

    同步方法在Eloquent ORM documentation中简要描述 .

  • 3

    好的,这是你可以尝试的 .

    both 模型中定义多对多关系 .

    class UserPermission extends Eloquent {
    
    protected $table = 'users_permissions';
    
    public $timestamps = false;
    
    protected $fillable = ['role_id', 'user_id'];
    
    protected function users() {
    
        return $this->belongsToMany('User');
    
        }
    
    }
    

    然后,如果您创建用户,请使用laravel attach方法将用户连接到users_permission,如下所示:

    $user = User::find(1);
    
    $user->roles()->attach(1);
    

    将ID为1的角色附加到ID为1的用户 .

    这是您可以将角色附加到用户或将用户附加到角色的方式,如果您正在创建用户或更新用户 .

    我真的希望这对你有所帮助 . 如果没有,请随时再问我 . 几天前我已经用照片和标签定义了很多很多关系,所以我很想说 .

    此外,laravel文档甚至还有一个用户和角色的示例:

    http://laravel.com/docs/eloquent#many-to-many

  • 1

    从阅读你的问题“听起来像”你问的是我前几天遇到的同样的问题 .

    我希望这有助于您在保持时间戳和避免重复关系的同时“批量更新”关系 .

    也许有更好的方法 . 我敢肯定 . 但这完全适用于我想要完成的事情 .

    *警告:这不是经过测试的代码 . 事实上,我使用一些搜索/替换的确切解决方案来帮助解决您的问题

    Class User extends BaseModel {
    
        // [...]
    
    
        public function roles() {
            return $this->belongsToMany('Role');
        }
    
    
    
        public function addUserRoles(Array $add_user_role_ids) {
            /**
             * Prevent Duplicate Relationships
             */
            $existing_user_role_ids = $this->roles()->lists('user_role_id');
    
            $add_user_role_ids      = array_diff($add_user_role_ids, $existing_user_role_ids);
            if ($add_user_role_ids == null) return false;
    
            $add_user_role_ids      = UserRole::whereIn('id', $add_user_role_ids)->lists('id');
            if ($add_user_role_ids == null) return false;
    
            /**
             * Attach (Insert into Pivot Table)
             */
            if ( count($add_user_role_ids) > 0 ) {
                $this->UserRoles()->attach($add_user_role_ids);
                // Update timestamp
                $this->touch();
            }
            // Return successfully added user role ids Array
            return $add_user_role_ids;
        }
    
    
    
        public function removeUserRoles(Array $user_role_ids)
        {
            $this->touch();
            $this->roles()->detach($user_role_ids);
        }
    
        // [...]
    }
    

    Eloquent Docs

    在Twitter上找到我:@ErikOnTheWeb

相关问题