Nasıl iki kayıt kendi kendine başvuran bir ilişki olup olmadığını kontrol etmek?

1 Cevap php

Kullanıcılar ve onların Meslektaşlarımız (arkadaşları) ile aşağıdaki şemayı göz önünde bulundurun:

Kullanıcılar

User:
  columns:
    user_id:
      name: user_id as userId
      type: integer(8)
      unsigned: 1
      primary: true
      autoincrement: true
    first_name:
      name: first_name as firstName
      type: string(45)
      notnull: true
    last_name:
      name: last_name as lastName
      type: string(45)
      notnull: true
    email:
      type: string(45)
      notnull: true
      unique: true
  relations:
    Collegues:
      class: User
      local: invitor
      foreign: invitee
      refClass: CollegueStatus
      equal: true
      onDelete: CASCADE
      onUpdate: CASCADE

Tablo tarihi:

CollegueStatus:
  columns:
    invitor:
      type: integer(8)
      unsigned: 1
      primary: true
    invitee:
      type: integer(8)
      unsigned: 1
      primary: true
    status:
      type: enum(8)
      values: [pending, accepted, denied]
      default: pending
      notnull: true

Şimdi, ben iki kayıtları, bir HTTP isteği (kullanıcı oturum açmış) yapmak kullanıcı için bir tane, ve o bir mesaj göndermek isteyen bir kullanıcı için bir kayıt diyelim. Ben bu kullanıcılar Meslektaşlarımız olup olmadığını kontrol etmek istiyorum.

Questions:

  1. Doktrin kendini ilişkileri ile iki kayıtları ilişkili olup olmadığını kontrol etmek için herhangi bir ön-build işlevi var mı?
  2. Eğer değilse, nasıl bu kontrol etmek için bir yöntem yazmak istiyorsunuz?
  3. Nereye vereceğini yöntemi söyledi? (User-sınıf, UserTable-sınıf vb)

Herhalde böyle bir şey yapabilirsiniz:

public function areCollegues (User $user1, User $user2) {
    // Ensure we load collegues if $user1 was fetched with DQL that
    // doesn't load this relation
    $collegues = $user1->get('Collegues');
    $areCollegues = false;
    foreach($collegues as $collegue) {
       if($collegue['userId'] === $user2['userId']) {
          $areCollegues = true;
          break;
       }
    }
    return $areCollegues;
}

Ama bu ne verimli ne de güzel görünüyor. Ben sadece kullanmak için güzel olmak kendinden referanslı ilişkileri zaten çözülmesi gerektiğini hissediyorum.

EDIT:

Biz şu ayarları göz önüne alındığında UserTable::construct():

$this->setAttribute(Doctrine::ATTR_COLL_KEY, 'userId');

Sonra yukarıdaki yöntem muhtemelen gibi yazılmış olabilir:

public function areCollegues (User $user1, User $user2) {
    // Ensure we load collegues if $user1 was fetched with DQL that
    // doesn't load this relation
    $collegues = $user1->get('Collegues');
    return isset($collegues[$user2['userId']);
}

Bu ilk önerilen yöntemin daha verimli olmalı, ama hala getirme (ve hidrat) ben istiyorum daha fazla kayıt ihtiyacı var.

1 Cevap

Belki bu ne sonra konum değil ama neden sadece tablosunu sorgulamak değil? Bu çok daha verimli:

$john = // invitor id
$lisa = // invited id
$q = Doctrine_Query::create()
    ->select('c.invitor')
    ->from('CollegueStatus c')
    ->where('c.invitor = ? AND c.invited = ? OR c.invitor = ? AND c.invited = ?, array($john, $lisa, $lisa, $john))
    ->limit(1);
$result = $q->execute(array(), Doctrine_Core::HYDRATE_NONE);
if (!empty($result)) echo 'they are colleagues';

Bir kullanıcı "davet" veya "Davet Eden", dolayısıyla VE VEYA VE inşa de olabilir kabul ettik.

Ve istediğiniz her yerde bir yöntem içinde bu koyabilirsiniz.