2012-06-09 48 views
2

我剛剛創建了一個具有多對多關係(User-Group)和下面的代碼的新項目。在Doctrine中手動保存多對多關係

正如你可以猜測在代碼中我試圖手動分配組給用戶,但它不分配任何東西......任何想法?

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'); 
    } 
+1

您是否檢查過「$ groups」實際上是否包含結果?如果這是空的,大概$ user就不會改變。 – halfer

+0

@halfer嗨halfer,我創建了兩個組。的var_dump(計數($組));返回int(2)。 – user1077220

+0

OK,進行調試。我不使用Doctrine(Propel for me),但是'$ user-> save()'返回一個布爾成功?查看文檔和/或庫代碼。在保存之後,我會親自放置一個臨時'exit()',並確保所有警告/錯誤報告都已打開。 – halfer

回答

2

嘗試定義的用戶實體之間的關係太(和組不使用foreingAlias)。同時使用本地國外字段。 所以,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 

如果不工作,我想你可以設置組與主義「鏈接」的方法。 見Record.php(大概在LIB /供應商/ symfony的/ lib目錄/插件/ sfDoctrinePlugin/lib中/供應商/學說/教義文件夾)

例子:

$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(); 
} 

請使用第一個選項,讓我知道如果任何這適合你!

+0

當多對多設置正確並且cascade persist已啓用(默認)時,您應該可以使用第一個選項(即$ user-> setGroups($ groups);'),而不用擔心ref類 – Dziamid