学说2加入onomanomany

时间:2014-06-23 14:16:12

标签: php doctrine-orm mapping

如果任何学说专家能帮助解决这个问题:

有一张表[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

所以我想用这个两个表格来映射到目前为止我所做的是

在菜单实体

/**
 * @ORM\OneToMany(targetEntity="Entity\Page", mappedBy="page_id", fetch="LAZY")
 **/ 
private $pages;

并在页面实体中

/**
 * @ORM\ManyToOne(targetEntity="Entity\Menu", inversedBy="pages") 
 * @ORM\JoinColumns({
 *      @ORM\JoinColumn(name="page_id", referencedColumnName="page_id") 
 * }) 
 **/
private $page_id;

现在所有页面都存储在Menu中的arraycollection中,称为$ pages

当我得到

时,一切正常
$repo = $em->getRepository('Entity\Menu');
$node = $repo->findOneById(1);

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

我可以看到所有与选定节点相关的页面都在那里,但是我的目标更多的是,作为关系的东西OneToOne我想通过给定的language_id只有一个与节点相关的页面,但我不知道怎么做。我想知道是否有一种方法可以在Page实体中为language_id提供一些where子句,但是我的所有尝试都没有成功,所以如果有人可以提供帮助就会很棒。提前谢谢!

1 个答案:

答案 0 :(得分:0)

经过一整天的挖掘后,我找到了一种我不知道是否是一个好的但似乎有用的方式。

我在菜单实体中创建了一个方法

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

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

所以我可以按语言获取页面