使用 Eloquent ORM/Laravel 写入 hasMany 关系

问题描述 投票:0回答:3

关于 Laravel 的 Eloquent ORM 的问题。我已经看过了,如果我错过了类似的问题,我深表歉意。

我有一个 User 模型,我正在尝试通过 User 模型中的关系将 Permissions 数组写回 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()
,这允许传递数组,但如果可能的话,我更愿意一步完成。

有人知道这是否可行吗?

谢谢!


更新

表格结构如下供您阅读:

用户表

+------------------+------------------+------+-----+---------+----------------+
| 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   |     |         |                |
+------------------+------------------+------+-----+---------+----------------+

用户权限表

+------------------+------------------+------+-----+---------+----------------+
| 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_id
users_roles.id
相关,并且
user_id
users.id

相关

作为后台逻辑,

users_roles
表有一个
url_access
列,其中包含 url。如果用户被分配给该角色,他们就可以从该 url 访问子页面。

php laravel eloquent laravel-4
3个回答
4
投票

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

我的解决方案:

用户.php

<?php

class User extends Eloquent {  

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

  protected $table = 'users';
  protected $guarded = array('id', 'password');
}

角色.php

<?php

class Role extends Eloquent {

public function users()
  {
  return $this->belongsToMany('User');
  }

protected $table = 'roles';
protected $guarded = array('id');

}

对应的数据库表应该是:

users
roles
role_user
。这些是根据 Laravel 的命名约定,以便让事情变得简单。

现在您可以调用

sync
方法并向其传递一个数组:

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

同步方法在Eloquent ORM文档中有简要描述。


1
投票

好的,这就是你可以尝试的。

在模型的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


0
投票

从阅读你的问题来看,“听起来”你在问我前几天遇到的同样的问题。

我希望这有助于您“批量更新”关系,同时维护时间戳并避免重复关系。

也许有更好的方法。我敢肯定。但这非常适合我想要实现的目标。

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

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);
    }

    // [...]
}

雄辩的文档

在 Twitter 上找到我:@ErikOnTheWeb

© www.soinside.com 2019 - 2024. All rights reserved.