2017-02-23 11 views
0

私は多くの関係を雄弁にしています。私は簡単にrole_permissionsデータを作成するためにattach()を使いたいのですが、私のIDにUUIDを使用していて、 'id'にはデフォルト値はありません。 attach()メソッドをハイジャックする方法はありますか?私は私のUUIDを設定することができますか?Laravel eloquent attach自動でランダムなIDを生成

マイ移行

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()メソッドに挿入するのですか?君たちありがとう。

+0

モデルとデータベースを正しく設定しても問題ありません。データベースとモデルコードを投稿してください。 –

+0

'code'を投稿できますか? – Paras

+0

基本的に私は多対多の関係を使用しているためモデルはありません。アタッチはクエリを作成して実行するだけです。 –

答えて

1

エラー

フィールド「ID」は、デフォルト値

は、データベースは、それが指定されていないときidフィールドを埋めるために方法を知らないという事実を意味する必要はありません。

どちらのスキーマがNULL可能の追加編集:

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

更新

将来のために開発者w hoは、たとえば、あなたはまた、添付の配列内の何かを設定することができ、この問題が発生します。

$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。*)は意図どおりに動作します

+0

これは動作しますが、idの値は繰り返されます。私はidをnullに設定したくありません。 –

+0

それは動作するようになった。これは私がしました。 foreachの($ permission_idsとして$ permission_id) \t {\t \t $ロールベース>アクセス許可() - >アタッチ($ permission_id、[ "ID" => UUID ::生成()])。 \t} –

+0

解決策を理解してくれてうれしいです。 –

0

@Claudio Ludovico Pannetaの助けを借りて私がやったことは大丈夫です。

foreach($permission_ids as $permission_id) 
    { 
     $role->permissions()->attach($permission_id, ["id" => Uuid::generate()]); 
    } 
+0

私の答えを更新しました –

関連する問題