0

我想在 Doctrine 中表示两个用户之间的朋友关系。我能够创建关系,但我不知道删除它的最佳方法是什么。

我有以下架构:

User:
  columns:
    name: string(255)
  relations:
    Friends:
      class: User
      local: user1
      foreign: user2
      refClass: FriendReference
      equal: true

FriendReference:
    columns:
        user1:
            type: integer
            primary: true
        user2:
            type: integer
            primary: true    

以下是我创建关系的方式:

$user1 = new User();
$user2 = new User();
$user1->Friends[] = $user2;

这完美地工作。

mysql> select * from friend_reference;
+-------+-------+
| user1 | user2 |
+-------+-------+
|     4 |     5 |
+-------+-------+
1 row in set (0.01 sec)

如果我要删除关系的两个主键 4 和 5,那么现在删除关系的最佳方法是什么?我可以

  1. 获取 ID 为 4 的对象并迭代$user->Friends,然后使用unlink删除此关系。
  2. 编写以下查询

    $query = Doctrine_Query::create()
       ->delete('FriendReference')
       ->where('(user1=4 AND user2=5) OR (user2=4 AND user1=5)')
       ->execute();
    

我认为这两种选择既不优雅也不高效。

4

2 回答 2

0

我会选择第二个选项。它不如第一个好,但遍历所有朋友删除一个似乎不是一个好主意。

于 2009-09-06T09:37:36.013 回答
0

我可能会做这样的事情:

class User extends Doctrine_Record {

   public function removeFriend (User $friend) {
      $this->getTable()->execute('remove.friend', 
         array('user1' => this->id, 'user2' => $friend->id));
   }
}

class UserTable extends Doctrine_Table {
   public function setUp () {
      $this->addNamedQuery('remove.friend',
         Doctrine_Query::create()
            ->delete('FriendReference')
            ->where('(user1=:user1 AND user2=:user2) 
                     OR (user2=:user1 AND user1=:user2)'
   }
}

//Some other place:
$user->removeFriend($noLongerMrNiceGuy);

您可以在此处阅读有关删除 nm 关系链接的推荐方法。文档摘录:

删除多对多关联记录之间的链接的正确方法是使用 DQL DELETE 语句。使用 DQL DELETE 的便捷且推荐的方式是通过查询 API。

// test.php
$q = Doctrine_Query::create()
    ->delete('GroupUser')
    ->addWhere('user_id = ?', 5)
    ->whereIn('group_id', array(1, 2));

$deleted = $q->执行();

另一种解除关联对象之间关系的方法是通过 Doctrine_Record::unlink 方法。但是,除非您已经拥有父模型,否则应避免使用此方法,因为它涉及首先查询数据库。

于 2009-09-06T16:41:40.977 回答