#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);
}
итак, я могу получить страницу по языку