Я хочу сохранить некоторые дополнительные данные в отношениях «многие ко многим», добавив дополнительные поля в таблицу ассоциаций. Например, я хотел бы отслеживать, какую роль пользователь имеет в сети, например, «член», «модератор», «администратор» и т. Д. Я также хотел бы отслеживать, когда он/она присоединился к сети. Теперь я ищу эффективный способ получить эти дополнительные поля с помощью Doctrine. Типичным, хотя и очень упрощена, DQL-запрос может выглядеть так:Поиск дополнительных столбцов во многих отношениях Таблица
// find.network.by.slug
Doctrine_Query::create()
->select('*')
->from('Network n')
->leftJoin('n.Members u')
->where('n.slug = ?');
Таким образом, учитывая, что у меня есть пользователь с соотношением членов, есть ли способ, что я могу «вернуться назад» в Связь NetworkMembers и выбор дополнительных полей?
Если нет, то как мне перестроить схему, чтобы я мог сделать это эффективно?
(т. Е. Я не хочу перебирать все сети, член должен найти сеть, с которой я начал, и получить поле 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
Вы должны сделать изменения в вашей схеме, или же n.NetworkMembers доступны rightaway? –
Это доступно сразу, из-за атрибута refClass в отношении. – PatrikAkerstrand