【问题标题】:Manually save a many to many relation in Doctrine在 Doctrine 中手动保存多对多关系
【发布时间】:2012-06-13 07:39:18
【问题描述】:

我刚刚创建了一个具有多对多关系(用户组)和以下代码的新项目。

正如您在代码中所猜到的那样,我正在尝试将组手动分配给用户,但它没有分配任何东西......有什么想法吗?

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

【问题讨论】:

  • 您是否检查过$groups 确实包含结果?如果这是空的,大概$user 将保持不变。
  • @halfer 嗨,halfer,我创建了两个组。 var_dump(count($groups));返回 int(2)。
  • OK,继续调试。我不使用 Doctrine (Propel for me) 但也许 $user->save() 返回布尔成功?检查文档和/或库代码。我个人会在保存后放置一个临时的exit(),并确保打开所有警告/错误报告。

标签: symfony1 doctrine many-to-many symfony-1.4


【解决方案1】:

也尝试在用户实体中定义关系(并且不要在组中使用foreingAlias)。还可以使用 localforeign 字段。 所以,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();
}

请使用第一个选项,让我知道这是否适合您!

【讨论】:

  • 当多对多设置正确并启用级联持久化(默认)时,您应该能够使用第一个选项(即$user->setGroups($groups);)而不用担心 ref 类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多