Как аннотировать поддокументы в 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 полей и выдачи запросов для обновления документов уведомлений, но это отдельный разговор.

Другие вопросы по тегам