Laravel eloquent attach自动生成随机ID

时间:2017-02-23 17:07:47

标签: laravel eloquent

我有很多很多关系,我想使用attach()轻松创建role_permissions数据,但问题是我正在使用UUID作为我的ID并且它会抛出错误字段'id'没有默认值。有没有劫持attach()方法的方法?所以我可以设置我的UUID?

我的迁移

 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()方法“注入”该唯一字符串?谢谢你们。

2 个答案:

答案 0 :(得分:1)

错误

  

Field' 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]);

更多信息on Laravel official doc

更新

对于遇到此问题的未来开发人员,您还可以在attach数组中设置任何内容,例如:

$role->permissions()->attach($permission_ids, ["id" => Uuid::generate()]);

更新2

说实话,还有一种更干净的方法来处理这个问题。我会尝试解释一下。

您只需挂钩boot方法即可处理事件服务提供商内的数据透视事件

这是一个片段

/App/Providers/EventServiceProvider.php
    public function boot()
    {
    Pivot::creating(function($pivot) {
        if ($pivot->getTable() == 'role_permissions') {
            $pivot->id = Uuid::generate();
        }
    });
    }
  

请注意我不知道您的laravel版本是否实际可行。我的(5.4。*)按预期工作

答案 1 :(得分:0)

好的设法修复了它,我在@Claudio Ludovico Panneta的帮助下做了什么。

When I fill in "article_Titulo" with "Sta Uors"   # features/step_definitions/teste1.rb:24
  Unable to find field "article_Titulo" (Capybara::ElementNotFound)
  ./features/step_definitions/teste1.rb:25:in `/^I fill in "(.*)" with "(.*)"/'
  features/teste1.feature:18:in `When I fill in "article_Titulo" with "Sta Uors"'