如何加入像Doctrine 2中的表格一样?

时间:2016-01-12 15:52:43

标签: php mysql symfony doctrine-orm doctrine

关于如何检索作为一个对象的连接entites的文档非常稀疏,并且关于该主题的大多数Stack Overflow问题已经存在很多年了。

我有一个symfony项目,并在Doctrine中完全映射数据库模式。在我的控制器中,我能够一个接一个地运行这两个查询,它们工作正常。

$page = $this->getDoctrine()
    ->getRepository('PageBundle:SitePages')
    ->findByprodpageid($id);

$matrices = $this->getDoctrine()
    ->getRepository('PageBundle:SiteMatrices')
    ->findByprodpageid($id);

但是它们都包含属性prodpageid,我想加入这个列上的两个实体,并接收一个包含两个表中所有列值的对象。

我在现有的数据库结构之上构建它,所以与更改数据库结构等无关,这是不可能的。

我在我的实体中添加了注释,以指定在ManyToOne关系中应该连接哪些列。但是,如何激活该关系并接收连接对象?

感谢有关此主题的任何信息。

编辑:这是我与实体的关系

//实体/ SITEPAGES

/**
 * @var integer
 *
 * @ORM\Column(name="ProdPageID", type="smallint")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 *
 * @ORM\OneToMany(targetEntity="SiteMatrices")
 * @ORM\JoinColumn(name="prodpageid", referencedColumnName="prodpageid")
 */
private $prodpageid;

//实体/ SiteMatrices

/**
 * @var integer
 *
 * @ORM\Column(name="ProdPageID", type="smallint", nullable=false)
 * @ORM\ManyToOne(targetEntity="SitePages")
 * @ORM\JoinColumn(name="prodpageid", referencedColumnName="prodpageid")
 *
 */
private $prodpageid;

1 个答案:

答案 0 :(得分:3)

您说Page有很多Matrices。我将根据您对绘图注释的许可进行一些更改:

/**
 * Entities/SitePages
 *
 * @var integer
 *
 * @ORM\Column(name="ProdPageID", type="smallint")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 *
 * @ORM\OneToMany(targetEntity="SiteMatrices")
 * @ORM\JoinColumn(name="prodpageid", referencedColumnName="prodpageid")
 */
private $matrices;

/**
* @return ArrayCollection
*/
public function getMatrices(){
   return $this->matrices;
}

/**
* @param Entities/SiteMatrices[]
* @return $this
*/
public function setMatrices($matrices){
    $this->matrices = $matrices;
    return $this;
}

/**
 * Entities/SiteMatrices
 *
 * @var integer
 *
 * @ORM\Column(name="ProdPageID", type="smallint", nullable=false)
 * @ORM\ManyToOne(targetEntity="SitePages")
 * @ORM\JoinColumn(name="prodpageid", referencedColumnName="prodpageid")
 *
 */
private $page;

/**
* @return Entities/SitePages
*/
public function getPage(){
   return $this->page;
}

/**
* @param Entities/SitePages
* @return $this
*/
public function setPage($page){
    $this->page = $page;
    return $this;
}

现在,如果您使用此DQL查询页面:

$pages = $this->getDoctrine()
   ->getRepository('PageBundle:SitePages')
   ->findByprodpageid($id);

然后你可以通过遍历矩阵关联来获得每个页面的矩阵:

foreach($pages as $page){
    $matrices = $page->getMatrices(); // will give you an ArrayCollection of all matrices objects joined by prodpageid to this page.
}

希望我没有弄错你的帮助。