доктрина 2 присоединиться к onetomany

#php #doctrine-orm #mapping

#php #doctrine-orm #отображение

Вопрос:

Если какой-либо эксперт по доктрине может помочь в этом:

существует таблица, [menu]

который выглядит как

 id | parent | lft | rgh | level | page_id
 1        0    1     2      0        1
 

существует таблица [pages]

 id | page_id | language_id | title |
 1      1       1            LANG1
 2      1       2            LANG2
 

итак, я хотел бы сопоставить эти две таблицы с doctrine то, что я сделал до сих пор, это

в сущности меню

 /**
 * @ORMOneToMany(targetEntity="EntityPage", mappedBy="page_id", fetch="LAZY")
 **/ 
private $pages;
 

и в сущности страницы

 /**
 * @ORMManyToOne(targetEntity="EntityMenu", inversedBy="pages") 
 * @ORMJoinColumns({
 *      @ORMJoinColumn(name="page_id", referencedColumnName="page_id") 
 * }) 
 **/
private $page_id;
 

теперь все страницы хранятся в arraycollection в меню, которое называется $pages

Все работает нормально, когда я получаю

 $repo = $em->getRepository('EntityMenu');
$node = $repo->findOneById(1);

//this returns $pages var 
$page = $node->getPages()->toArray();
var_dump($page);
 

Я вижу, что все страницы, связанные с выбранным узлом, есть, но моя цель — больше иметь, что-то вроде отношения OneToOne Я хотел бы иметь только одну страницу, связанную с узлом по заданному language_id, но я не знаю, как это сделать. Мне было интересно, есть ли способ указать language_id с некоторым предложением where в сущности страницы, но все мои попытки безуспешны, поэтому, если кто-то может помочь, было бы здорово. Заранее спасибо!

Ответ №1:

После целого дня поисков я нашел способ, не знаю, хороший ли он, но, кажется, работает.

Я создал метод в моей сущности меню

 public function getPageByLanguageId($language_id)
{
    $criteria = Criteria::create();
    $criteria->where(Criteria::expr()->eq('language', $language_id));

    return $this->pages->matching($criteria);
}
 

итак, я могу получить страницу по языку