2009-09-03 5 views
0

Я хочу сохранить некоторые дополнительные данные в отношениях «многие ко многим», добавив дополнительные поля в таблицу ассоциаций. Например, я хотел бы отслеживать, какую роль пользователь имеет в сети, например, «член», «модератор», «администратор» и т. Д. Я также хотел бы отслеживать, когда он/она присоединился к сети. Теперь я ищу эффективный способ получить эти дополнительные поля с помощью Doctrine. Типичным, хотя и очень упрощена, DQL-запрос может выглядеть так:Поиск дополнительных столбцов во многих отношениях Таблица

// find.network.by.slug 
Doctrine_Query::create() 
    ->select('*') 
    ->from('Network n') 
    ->leftJoin('n.Members u') 
    ->where('n.slug = ?'); 
  1. Таким образом, учитывая, что у меня есть пользователь с соотношением членов, есть ли способ, что я могу «вернуться назад» в Связь NetworkMembers и выбор дополнительных полей?

  2. Если нет, то как мне перестроить схему, чтобы я мог сделать это эффективно?

    (т. Е. Я не хочу перебирать все сети, член должен найти сеть, с которой я начал, и получить поле role и member_since).

код иллюстрации моей проблемы:

$networkTable = Doctrine::getTable('Network'); 
$network = $networkTable->executeOne('find.network.by.slug', $slug); 
$members = $network->Members; 
foreach($members as $member) { 
    // How do I access the fields in the NetworksMember association? 
} 

схемы ниже:


User: 
    tableName: users 
    columns: 
    user_id: 
     name: user_id as userId 
     type: integer(8) 
     unsigned: 1 
     primary: true 
     autoincrement: true 
    username: 
     type: string(30) 
     notnull: true 
     unique: true 
    relations: 
    Networks: 
     class: Network 
     local: user_id 
     foreign: network_id 
     refClass: NetworkMembers 
     type: many 

Network: 
    tableName: networks 
    actAs: 
    Sluggable: 
     unique: true 
     fields: [name] 
     canUpdate: true 
    Timestampable: 
    columns: 
    id: 
     type: integer(8) 
     unsigned: 1 
     primary: true 
     autoincrement: true 
    name: 
     type: string(64) 
     notnull: true 
    relations: 
    Members: 
     class: User 
     type: many 
     refClass: NetworkMembers 
     local: network_id 
     foreign: user_id 
     foreignAlias: Networks 
     foreignType: many 

NetworkMembers: 
    actAs: 
    Timestampable: 
     created: 
     name: member_since as memberSince 
     type: timestamp 
     updated: 
     disabled: true 
    columns: 
    networkId: 
     name: network_id as networkId 
     type: integer(8) 
     unsigned: 1 
     primary: true 
    userId: 
     name: user_id as userId 
     type: integer(8) 
     unsigned: 1 
     primary: true 
    role: 
     type: enum 
     values: [member, moderator, admin] 
     default: member 
    relations: 
    Network: 
     type: one 
     local: network_id 
     foreign: id 
    Member: 
     class: User 
     type: one 
     local: user_id 
     foreign: user_id 

ответ

3

я это сам, просто должен был взять небольшой другой подход:

// find.network.by.slug 
     Doctrine_Query::create() 
      ->select('*') 
      ->from('Network n') 
      ->leftJoin('n.NetworkMembers nm') 
      ->leftJoin('nm.Member u') 
      ->leftJoin('n.Founder f') 
      ->leftJoin('n.Icon icon') 
      ->where('n.slug = ?') 

// later: 
$members = $this->network->NetworkMembers; 
foreach($members as $networkMember) { 
    echo $networkMember->Member->username; 
    echo $networkMember->role; // Here I can access the 
           // NetworkMember association directly 
} 
+0

Вы должны сделать изменения в вашей схеме, или же n.NetworkMembers доступны rightaway? –

+0

Это доступно сразу, из-за атрибута refClass в отношении. – PatrikAkerstrand