Одна очень важная вещь, чтобы понять здесь, что доктрина использует шаблон Mapper данных и не Активный шаблон записи (вы можете найти его в фреймворком, например):
Доктрины 2 - объектно-реляционный картограф (ORM) для PHP 5.4+, что обеспечивает прозрачную устойчивость для объектов PHP. Использует данные Картонный шаблон в сердце, направленный на полное разделение вашего домена/бизнес-логики от сохранения в реляционной базе данных системы управления.
Преимущество Доктрины для программиста заключается в возможности сосредоточиться на объектно-ориентированной бизнес-логике и беспокоиться о сохранении только как вторичной проблемой. Это не означает, что упорство преуменьшено Доктрина 2, однако мы считаем, что для объектно-ориентированного программирования существуют значительные преимущества , если сохраняемость и объекты поддерживаются отдельно.
http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/tutorials/getting-started.html#what-is-doctrine
Это по существу означает, что объектные классыне знаю одну вещь о том, как они сохранялись в базе данных. Несмотря на то, что они могут содержать аннотации комментариев к ним, это всего лишь форма метаданных, обрабатываемых ORM.
В свою очередь это означает, что вы можете сделать то же самое, что и с ActiveRecord, но теперь это делается только в другом месте. Давайте посмотрим на разницу:
В ActiveRecord на основе ORM (как Yii):
$books = Book::model()->with('author')->findAll();
В DataMapper основе ORM (как Symfony/Doctrine):
$books = $this->getDoctrine()->createQueryBuilder()
->select(['b', 'a'])
->from('AppBundle:Book', 'b')
->join('b.author', a')
->addSelect('a')
->getQuery()
->getResult();
Небольшой комментарий к более позднему. Запрос, который вы строите там, не SQL-запрос, а скорее DQL-запрос (язык-запрос-запрос, используемый в Doctrine).
Так присоединиться/addSelect здесь очень похожа на с на бывшем запросе просто говорит ORM движок, который вы хотели бы загрузить автор в том же запросе. Метаданные специфических отношений (например, имена столбцов для обеих базовых таблиц) по-прежнему определены там на уровне метаданных объектов.
Синтаксис (выберите, из, присоединиться) напоминает SQL с целью, но его не следует путать. Здесь, создавая запрос, вы управляете объектами ORM , а не столбцами/таблицами базы данных.
Самый простой способ - просто присоединиться к отношениям авторов, предпочтительно, создав собственный метод «findAllWithAuthors» в репозитории книг или аналогичный. Я написал ответ на аналогичный вопрос здесь http://stackoverflow.com/questions/36250248/symfony2-count-entity-fields-that-relate-to-another-entity/36253620#36253620 – JimL
@JimL Omg ... это действительно так трудно сделать в Доктрине ?! –
Я бы не назвал это тяжело. Наличие запросов в репозиториях считается лучшей практикой. Вы также можете просто создать запрос в контроллере. Стандартные простые методы (find, findby и т. Д.), Как правило, просто для того, чтобы вы начали. Очень немногие задерживаются в любой реальной логике приложения/домена. – JimL