2

多対多の関係 (ユーザー グループ) と以下のコードで新しいプロジェクトを作成しました。

コードで推測できるように、ユーザーに手動でグループを割り当てようとしていますが、何も割り当てられません...何か考えはありますか?

User:
  columns:
    id: 
      type: integer(4)
      autoincrement: true
      primary: true
    username:
      type: string(255)
    password:
      type: string(255)
  attributes:
    export: all 
    validate: true

Group:
  tableName: group_table
  columns:
    id: 
      type: integer(4)
      autoincrement: true
      primary: true
    name:
      type: string(255)
  relations:
    Users:
      foreignAlias: Groups
      class: User
      refClass: GroupUser

GroupUser:
  columns:
    group_id:
      type: integer(4)
      primary: true
    user_id:
      type: integer(4)
      primary: true
  relations:
    Group:
      foreignAlias: GroupUsers
    User:
      foreignAlias: GroupUsers

コードは次のとおりです。

  public function executeIndex(sfWebRequest $request)
  {
    $user = Doctrine_Core::getTable('User')->find(1);

    $groups = Doctrine_Core::getTable('Group')->findAll();

    $user->setGroups($groups);

    $user->save();
    $this->forward('default', 'module');
  }
4

1 に答える 1

2

User エンティティでもリレーションを定義してみてください (グループで foringAlias を使用しないでください)。ローカルフィールドと外部フィールドも使用します。したがって、schema.yml は次のようになります。

User:
  ...
  relations:
    Groups:
      class: Group
      refClass: GroupUser
      local: user_id
      foreign: group_id

Group:
  ...
  relations:
    Users:
      class: User
      refClass: GroupUser
      local: group_id 
      foreign: user_id

それがうまくいかない場合は、Doctrine の「リンク」メソッドでグループを設定できると思います。Record.php を参照してください (おそらく lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine フォルダーにあります)

例:

$groups_ids = array();
foreach($groups as $group) $groups_ids[] = $group->getId();
$user->link('Groups',$groups_ids);

また、そのリレーションにインスタンスを追加するだけの場合 (そして、将来コードを修正する人が嫌いな場合)、N-GroupUsers の例を作成できます。

foreach($groups as $group) {
    $ug = new GroupUser();
    $ug->setUserId($user->getId());
    $ug->setGroupId($user->getId());
    $ug->save();
}

最初のオプションを使用して、これがうまくいくかどうか教えてください!

于 2012-06-19T19:57:28.100 に答える