Doctrine2 + условия присоединения - PullRequest
1 голос
/ 25 ноября 2010

Прежде всего, я хочу сказать большое спасибо разработчикам Doctrine, ребята, вы рок!Моя проблема заключается в следующем:

У меня есть три таблицы:

person (id, name, isActive)
email (id, address, isActive)
personEmailRel(id, personId, emaiId, isActive)

И я хочу получить список писем по человеку:

/**
 * Unidirectional - Many persons have many emails
 *
 * @ManyToMany(targetEntity="Address_Model_Email")
 * @JoinTable(name="personEmailRel",
 *   joinColumns={@JoinColumn(name="personId", referencedColumnName="id")},
 *   inverseJoinColumns={@JoinColumn(name="emailId", referencedColumnName="id")}
 * )
 */
private $_emails;

public function __construct()
{
    $this->_emails = new Collections\ArrayCollection();
}

public function getEmails()
{
    return $this->_emails;
}

Работает нормально.Но проблема в том, что я также хочу установить условие сложения в предложении соединения isActive = 1.Как решить это в Doctrine2?Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2013

Doctrine не поддерживает условия в ассоциациях, но есть несколько способов решить эту проблему:

Создайте метод репозитория, который запрашивает связанные сущности, которые вы хотите. См. Запрос и QueryBuilder .

Используйте API Критерии сбора для фильтрации неактивных объектов из коллекции в получателе (в вашей сущности). Если связь помечена как «EXTRA_LAZY», вместо извлечения всей коллекции будут использоваться оптимизированные запросы. Это очень полезно для больших коллекций.

Используйте Filter API для фильтрации неактивных объектов на уровне БД. Это очень полезно, когда вы почти всегда хотите скрыть неактивные (или удаленные и т. Д.) Объекты.

0 голосов
/ 25 ноября 2010

Вы не работаете с ManyToMany, но создаете третье лицо PersonEmail.

Я считаю вашу схему базы данных весьма сомнительной. Почему электронная почта может иметь много людей? Разве не должно быть отношения OneToMany в этом случае? Я не вижу пользы от таблицы соединений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...