Как аннотировать поддокументы в Doctrine MongoDB?
Я хочу реализовать классы php, которые должны моделировать следующее: (Symfony,DoctrineMongoDBBundle)
Notification Collection { from { id , fname } , to , sentDate }
Member Collection { id , fname , lname , email , phone , regDate , ... }
И я хочу сказать ODM: "from field - это объект, который содержит только 2 значения,id отправителя и его имя"
Какую аннотацию я должен использовать? Должен ли я определить другой класс, как из.php? Или я могу создать два класса следующим образом:
/*
*@Document
*/
class Notification {
/*
*@Id
*/
protected $id;
/*
*@EmbedOne(targetDocument="Member")
*/
protected $from;
/*
*@ReferenceOne(targetDocument="Member")
*/
protected $to;
/*
*@Date
*/
protected $sentDate;
}
/*
*@Document
*/
class Member {
/*
*@Id
*/
protected $id;
/*
*@String
*/
protected $fname;
/*
*@String
*/
protected $lname;
/*
*@String
*/
protected $email;
.
.
.
}
Если это правильно, в моем контроллере, как я могу контролировать поле "от", чтобы хранить только id и fname из объекта Member? предположим это:
$senderUser;
$newNotification = new Notification();
$newNotification->setFrom($senderUser);
Затем $newNotification->from set для объекта Member, который содержит всю информацию о Member. Но я хочу, чтобы сохранялись только id и fname отправителя! (потому что потребности моего проекта) Извините мои грамматические ошибки в английском. Спасибо за любую помощь...
1 ответ
Если вы настаиваете на том, чтобы в уведомлении были указаны исходный идентификатор пользователя и имя from
поле, то вам потребуется отношение Embed One к документу From, который, в свою очередь, имеет следующие поля:
id
: это должна быть ссылка номер один на документ участника. Я бы предложил использоватьsimple
опция для ссылки, так что вы сохраняете только значение идентификатора члена, а не объект DBRef.fname
: это должно быть строковое поле. ODM не имеет возможности поддерживать его в актуальном состоянии с указанным в документе участником, поэтому вам необходимо убедиться в этом самостоятельно.
Лично документ уведомления кажется настолько маленьким, что я бы просто создал fromMember
а также fromMemberFirstName
Поля непосредственно на Уведомление. Затем вы можете добавить немного логики в setFromMember()
метод, который также устанавливает fromMemberFirstName
поле из переданного аргумента члена.
Если вы хотите сделать что-то еще, вы можете изучить использование событий для мониторинга объектов-членов на предмет изменений fname
полей и выдачи запросов для обновления документов уведомлений, но это отдельный разговор.