2016-05-20 7 views
1

私は以前同様の質問をしましたが、それ以来多くの変更を行いましたが、今は別の問題があります。 スキーマを以下のように変更しました。ピボットテーブルを使用して多対多の関係を処理する

Schema::create('users', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->string('userName')->default(''); 
    $table->string('userEmail')->default(''); 
    $table->timestamps(); 
}); 

Schema::create('user_groups', function(Blueprint $table) 
{ 
    $table->increments('id'); 
    $table->string('groupName')->default(''); 
    $table->timestamps(); 
    $table->softDeletes(); 
}); 

Schema::create('users_user_groups', function(Blueprint $table) 
{ 
    $table->increments('id'); 
    $table->integer('user_id')->unsigned(); 
    $table->integer('group_id')->unsigned(); 
}); 

Schema::table('users_user_groups', function(Blueprint $table) { 
    $table->foreign('user_id')->references('id')->on('users'); 
    $table->foreign('group_id')->references('id')->on('user_groups'); 
}); 

基本的に、ユーザーは多数のuser_groupsに分かれていてもよく、user_groupsには多くのユーザーが存在できます。だから、多対多の関係 を調べているので、テーブルusers_user_groupsを追加しました。私はこれらの2つのために私のモデルを設定します。

class User extends Model 
{ 
    protected $table = 'users'; 
    protected $guarded = []; 

    public function groups() 
    { 
     return $this->belongsToMany('App\Group', 'users_user_groups')->withPivot('user_id', 'group_id'); 
    } 
} 

class Group extends Model 
{ 
    protected $table = 'user_groups'; 
    protected $guarded = []; 

    public function profusionUser() 
    { 
     return $this->belongsToMany('App\User', 'pusers_user_groups')->withPivot('user_id', 'group_id'); 
    } 
} 

私は確かに上記が正しく設定されていると確信しています。今この作業は私のUserControllerで行われます。中心的な機能は で、何が起きているのかを説明するためにコメントしようとしました。

public function updateUsers() 
{ 
    $users = Helper::returnUsersFromLdap(); //Get all users from Directory 

    foreach($users as $userName => $userData) { 
     $user = User::firstOrNew(['userName' => $userName]); //Create user if needed 

     foreach ($userData as $userEmail => $userDepartment) { 
      $name = preg_replace('/@.*?$/', '', $userEmail); 
      $user->userEmail = $userEmail; 

      $userGroups = Helper::returnGroupsFromLdap($name); //Get all user_groups user is apart off 

      foreach ($userGroups as $group) { 
       $usGroup = new Group(); //Create the user_groups 
       $usGroup->groupName = $group; 
       $usGroup->save(); 
      } 
      $user->save(); 
      $user->groups()->sync($userGroups); //Link the users groups to the user 
     } 
    } 

    return Redirect::route('users.index'); 
} 

だから私のUSER_GROUPSテーブルがそのように

+-----+------------+---------------------+---------------------+------------+ 
| id | groupName | created_at   | updated_at   | deleted_at | 
+-----+------------+---------------------+---------------------+------------+ 
| 1 | Group 1 | 2016-05-20 15:55:34 | 2016-05-20 15:55:34 | NULL  | 
| 2 | Group 2 | 2016-05-20 15:55:34 | 2016-05-20 15:55:34 | NULL  | 
| 3 | Group 3 | 2016-05-20 15:55:34 | 2016-05-20 15:55:34 | NULL  | 
| 4 | Group 4 | 2016-05-20 15:55:34 | 2016-05-20 15:55:34 | NULL  | 
| 5 | Group 1 | 2016-05-20 15:55:34 | 2016-05-20 15:55:34 | NULL  | 
| 6 | Group 3 | 2016-05-20 15:55:34 | 2016-05-20 15:55:34 | NULL  | 
| 7 | Group 2 | 2016-05-20 15:55:34 | 2016-05-20 15:55:34 | NULL  | 
| 8 | Group 5 | 2016-05-20 15:55:34 | 2016-05-20 15:55:34 | NULL  | 
| 9 | Group 1 | 2016-05-20 15:55:34 | 2016-05-20 15:55:34 | NULL  | 
| 10 | Group 2 | 2016-05-20 15:55:34 | 2016-05-20 15:55:34 | NULL  | 
| 11 | Group 1 | 2016-05-20 15:55:34 | 2016-05-20 15:55:34 | NULL  | 
| 12 | Group 3 | 2016-05-20 15:55:34 | 2016-05-20 15:55:34 | NULL  | 

のようなデータが移入された今、最初の問題は、私は、彼らがする必要がある場合はわからないときグループは、この表に繰り返されているということでしょうか? 2人のユーザーが同じ グループに属している場合、上記の2つのエントリが各ユーザーに1つずつ作成されます。どういうわけか私はこれをユニークにするべきですか?

私の2番目の問題は、ピボットテーブルに関するものです。これの出力はそうです

+-----+--------------------+ 
| id | user_id | group_id | 
+-----+--------------------+ 
| 1 |  1 |  0 | 
| 2 |  1 |  0 | 
| 3 |  1 |  0 | 
| 4 |  2 |  0 | 
| 5 |  2 |  0 | 
| 6 |  3 |  0 | 
| 7 |  3 |  0 | 
| 8 |  3 |  0 | 
| 9 |  3 |  0 | 

したがって、user_idは適切に更新されており、正しい回数です。だから私はid 1のユーザーが3つのグループに属していることを知っています。 しかし、何らかの理由でgroup_idが更新されていません。

これが正しく更新されない理由はありますか?任意の提案が評価されており、user_groupsのテーブルに関するいくつかの入力を得て、これに一意のグループ名を含めるべきかどうかを確認するのが良いでしょう。

感謝

+0

テーブル定義のスクリーンショットを表示できますか?彼らの構造があなたが思うものであるかどうかを調べるだけです... – Amarnasan

答えて

1

は、私はその "豊富" テーブルの使用が何であるかわからないが、私はこのことを考える:

Schema::create('users_user_groups', function(Blueprint $table) 
{ 
    $table->increments('id'); 
    $table->integer('user_id')->unsigned(); 
    $table->integer('group_id')->unsigned(); 
    $table->foreign('user_id')->references('id')->on('users'); 
    $table->foreign('group_id')->references('id')->on('user_groups'); 
}); 

Schema::create('users_user_groups', function(Blueprint $table) 
{ 
    $table->increments('id'); 
    $table->integer('user_id')->unsigned(); 
    $table->integer('group_id')->unsigned(); 
}); 

は、このする必要がありますつまり、users_user_groupsテーブルに "foreign"パートを指定する必要がありますが、何とか "profusion_whatever"テーブルで終わってしまいました。

1

です。2人のユーザーが同じグループに所属している場合、上記の2つのエントリが各ユーザーに1つずつ作成されます。どういうわけか私はこれをユニークにするべきですか?

はい、user_groupsテーブルは一意にグループを持つ必要があります。多対多の関係を維持するのは、ピボットテーブルの仕事です。

user_groupsにグループが重複しているのは、グループを作成するforeachループがユーザーのforeach内にあるためです。

ループを直接データベースに挿入する代わりに、グループを保持するforeach(ユーザー)ループ内に配列を作成します。

$groupsArray[] = []; //define this outside the users foreach loop 

//inside the users foreach loop 
foreach ($userGroups as $group) { 
    if(!array_key_exists($group, $groupsArray){ 
     $groupsArray[$group] = true; 
    } 
} 

//then, outside the users foreach loop: 
foreach($groupsArray as $group){ 
    $usGroup = new Group(); //Create the user_groups 
    $usGroup->groupName = $group; 
    $usGroup->save(); 
} 
関連する問題