Laravel雄辩附加自动生成随机ID
我有一个雄辩的多对多关系,我想使用attach()轻松创建角色权限数据,但问题是我使用UUID作为我的ID,它抛出一个错误字段“ID”没有默认值。有没有劫持attach()方法的方法?这样我就可以设置UUID了 我的迁移Laravel雄辩附加自动生成随机ID,laravel,eloquent,Laravel,Eloquent,我有一个雄辩的多对多关系,我想使用attach()轻松创建角色权限数据,但问题是我使用UUID作为我的ID,它抛出一个错误字段“ID”没有默认值。有没有劫持attach()方法的方法?这样我就可以设置UUID了 我的迁移 Schema::create('role_permissions', function (Blueprint $table) { $table->increments('count')->unique(); $table->s
Schema::create('role_permissions', function (Blueprint $table) {
$table->increments('count')->unique();
$table->string('id')->unique();
$table->string('role_id');
$table->string('permission_id');
$table->timestamps();
});
我的模型
class Role extends Model
{
//
public $incrementing = false;
public function users()
{
return $this->belongsToMany('App\User', 'user_roles', 'role_id', 'user_id');
}
public function permissions()
{
return $this->belongsToMany('App\Permission', 'role_permissions', 'role_id', 'permission_id');
}
}
我的附加代码
$role->permissions()->attach($permission_ids);
我知道这里的问题是我的id不是一个递增的数字,而是一个唯一的字符串。我的问题是如何将唯一的字符串“注入”到attach()方法?谢谢大家。错误
字段“id”没有默认值
指数据库不知道如何填充未指定的id
字段
您可以编辑架构并添加可为空的:
Schema::create('role_permissions', function (Blueprint $table) {
$table->increments('count')->unique();
$table->string('id')->unique()->nullable(); // Bad idea
$table->string('role_id');
$table->string('permission_id');
$table->timestamps();
});
或通过连接将其注入:
$role->permissions()->attach($permission_ids, ["id" => null]);
更多信息
更新
对于遇到此问题的未来开发人员,您还可以在附加阵列中设置任何内容,例如:
$role->permissions()->attach($permission_ids, ["id" => Uuid::generate()]);
更新2
老实说,还有一种更干净的处理方法。我会尽力解释的
只需挂接到boot
方法,即可在事件服务提供程序内处理Pivot事件:
这里有一个片段
/App/Providers/EventServiceProvider.php
public function boot()
{
Pivot::creating(function($pivot) {
if ($pivot->getTable() == 'role_permissions') {
$pivot->id = Uuid::generate();
}
});
}
请注意,我不知道这在您的laravel版本中是否实际可行。矿山(5.4.*)按预期工作
好吧,我在克劳迪奥·卢多维科·帕内塔的提示下成功地解决了这个问题
foreach($permission_ids as $permission_id)
{
$role->permissions()->attach($permission_id, ["id" => Uuid::generate()]);
}
如果您已经正确设置了模型和数据库,这应该不是问题,您可以发布数据库和模型代码吗?您可以发布您的
代码吗?
?基本上没有模型,因为我使用的是多对多关系。因此,attach只需创建一个查询并执行它。代码现在添加到@ParasThis works,但id的值将重复。我不想把id设为空,让它工作吧。是我干的。foreach($permission\u id as$permission\u id){$role->permissions()->attach($permission\u id,[“id”=>Uuid::generate());}很高兴听到您理解了解决方案。