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:
- 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ı?
- Eğer değilse, nasıl bu kontrol etmek için bir yöntem yazmak istiyorsunuz?
- 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.