2009-09-06 33 views
0

我想在Doctrine中表示兩個用戶之間的朋友關係。我可以創建關係,但我不知道刪除它的最佳方式是什麼。如何刪除Doctrine中的自引用n:n關係?

我有以下模式:

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  

下面是如何創建relationsship:

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

我覺得這兩個選項既不優雅,也不高性能。

回答

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

您可以閱讀有關的推薦方式去除N-M的關係鏈接here。摘自文檔:

刪除多對多關聯記錄之間鏈接的正確方法是使用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-> execute();

解除相關對象之間關係的另一種方法是通過Doctrine_Record :: unlink方法。但是,除非已經有父模型,否則應該避免使用此方法,因爲它首先涉及查詢數據庫。

0

我會去第二個選項。它不如第一個那麼好,但是迭代所有朋友刪除它似乎並不是一個好主意。

相關問題