关于 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 访问子页面。
我真的不明白为什么你使用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文档中有简要描述。
好的,这就是你可以尝试的。
在模型的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 文档甚至还有一个包含用户和角色的示例:
从阅读你的问题来看,“听起来”你在问我前几天遇到的同样的问题。
我希望这有助于您“批量更新”关系,同时维护时间戳并避免重复关系。
也许有更好的方法。我敢肯定。但这非常适合我想要实现的目标。
*警告:这不是经过测试的代码。事实上,我自己使用了一些搜索/替换的确切解决方案来帮助解决您的问题
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