Doctrine2 + join conditions

Ярослав

Новичок
Здравствуйте.

Начинаеться проект на Zend Framework + Doctrine 2 (Пока что бета).
С зендом знаком давно, а вот с доктрин только начало.
Использую модульную структуру зенда: http://framework.zend.com/manual/en/project-structure.filesystem.html
Пока структура модуля виглядит как:
Код:
      <modulename>
          configs/
              application.ini
          controllers/ <- контроллеры
              helpers/
          forms/ <- формы
          layouts/
              filters/
              helpers/
              scripts/
          models/   <- модели (entities)
              mappers/ <- маппери (entity repositories), если нужно нестандартный
          services/   <- слой сервисов (http://martinfowler.com/eaaCatalog/serviceLayer.html)
          views/ <- шаблоны, фильтры и т.д.
              filters/
              helpers/
              scripts/
          Bootstrap.php <- инициализация модуля (пока не использую)
Идея следующая:
+ идет запрос на контроллер
+ контроллер создает сервис
+ сервис валидирует данные, проверяет права, начинает и заканчивает транзакции
+ работает с данными (entities) через репозитарий
+ получает сущности
+ передача в шаблон
+ шаблон прекрасно выводит

На данном этапе все начинает потихоньку уже работать, просто интересует двигаюсь ли я в правильном направлении.

И еще очень важный вопрос по Doctrine2
Есть entities:
person (id, name, isActive)
email (id, address, isActive)
personEmailRel(id, personId, emaiId, isActive)

в персон есть например метод getEmails
Код:
    /**
     * 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;
    }
Далее начинаю выборку емейлов
$person->getEmails()
все отлично возвращает, НО
как поставить условие чтобы возвращало только когда isActive=1?
В базе чуть более 200 таблиц и в большей половине стоит поле isActive :(
На данном этапе я вижу решение только как подменять репозиторий и в нем уже выставлять дополнительное условие. Но опять же если понадобяться значения isActive=0 тогда в репозитории придеться выставлять флаги чтобы игнорировать этот функционал.
Еще как вариант делать в репозиториях дополнительные методы findIsActive($id), findIsActiveBy(...)
Как лучше решить эту проблему?
Как доктрин решает это?
Заранее благодарен за советы и подсказки.
 

uvlek

Новичок
В своём проекте на symfony2 - я пишу что то подобное:

PHP:
use Doctrine\Common\Collections\Criteria; // путь может другим

$criteria = Criteria::create();
$this->_emails->matching($criteria);
К сожалению данный код не работает в связи ManyToMany. Даже не знаю почему.
 
Последнее редактирование:

uvlek

Новичок
Тут имееться в виду не один email на несколько человек.
Посмотрите внимательнее Ярослав вынес отдельно связующую таблицу.
Честно это не удобно, и доктрина не особо добра когда так делают.
Лучше использовать обычный вариант (ManyToMany, три таблицы, две сущности).
 

Вурдалак

Продвинутый новичок
uvlek, здесь many-to-many, это по определению подразумевает, что допускается вариант, когда несколько человек имеет один email. Я спрашиваю почему не one-to-many.
 
  • Like
Реакции: WMix
Сверху