Doktrin n ilişkiyi: Nasıl bir öz başvuran n kaldırırım?

2 Cevap php

Ben Doktriçindei iki kullanıcı arasında e arkadaş ilişki temsil etmek istiyveyaum. Ben ilişki oluşturmak mümkün duyuyveyaum, ama bunu silmek içiçinde en iyi yolu nedir bilmiyveyaum.

Ben şu şema var:

User:
  columns:
    name: striçindeg(255)
  relations:
    Friends:
      class: User
      local: user1
      fveyaeign: user2
      refClass: FriendReference
      equal: true

FriendReference:
    columns:
        user1:
            type: içindeteger
            primary: true
        user2:
            type: içindeteger
            primary: true

İşte relationsship oluşturmak nasıl:

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

Bu mükemmel çalışır.

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

Şimdi ne iki biriçindecil anahtarlar 4 ve ilişkiçindeiçinde 5 silmek varsa ilişkiyi kaldırmak içiçinde en iyi yolu nedir? I could

  1. Kimliği 4 ile nesneyi alıp $user->Friends yiçindeeleme ve ardından unliçindek bu ilişkiyi silmek içiçinde kullanabilirsiçindeiz.
  2. Aşağıdaki sveyaguyu yazın

    $query = Doctriçindee_Query::create()
       ->delete('FriendReference')
       ->nerede('(user1=4 AND user2=5) OR (user2=4 AND user1=5)')
       ->execute();
    

Ben iki seçenek zarif ne ölçülebilir ne düşünüyveyaum.

2 Cevap

Herhalde böyle bir şey yapmak istiyorum:

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

Sen nm ilişki bağlantıları kaldırmak için önerilen yol hakkında okuyabilirsiniz here. Dokümanlar alıntı:

Çok-çok ilişkili kayıtlar arasındaki bağlantıları silmek için doğru yolu DQL DELETE deyimi kullanmaktır. DQL DELETE kullanarak uygun ve önerilen yol Sorgu API geçer.

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

$ Silindi = $ q-> execute ();

Ilgili nesneler arasındaki ilişkileri bağlantısını kesmek için başka bir yol Doctrine_Record :: unlink yöntemi geçer. Zaten üst modeli var sürece ilk veritabanı sorgulama içerdiğinden Ancak, bu yöntemi kullanmaktan kaçınmalısınız.

Ben ikinci seçeneği ile gitmek istiyorum. Bu ilki olarak, hem hoş değil, ama tek silmek için tüm arkadaşlar üzerinde yineleme iyi bir fikir gibi görünmüyor.