在Symfony2中使用Doctrine2和外键

时间:2015-08-18 15:38:31

标签: mysql symfony doctrine-orm foreign-keys twig

我有一个MySQL数据库(稍后导入Doctrine)设置,通过外键链接3个不同的表。关系如下:很多As转到一个B,很多B转到一个C.对于我想要创建的网页,我需要一些关于A的页面上相关的B信息,同时按C进行分类。

可以这样想:A是" dog_food",B是"公司",C是" company_category"。也就是说,在显示不同种类狗粮的页面上,我需要显示有关制造公司的信息;我只根据用户如何指定他们想要购买的公司来展示这些狗食。

从A动态提取信息是微不足道的,因为存储库被拉出并且行作为实体存在。比方说,{{ dog_food.price }}会调用(如果在for循环中指定,这是Twig代码)单个实例的价格。

我已经阅读过@OneToOne,@ OneToMany等注释,但是还没有找到一种方法来轻松利用Twig模板中的效果。所有3个表的聚合实体和存储库作为Controller中的变量存在。应该提到的是,继续这个例子,表B中有一个单一的companyID字段对应多个狗食,一个categoryID与多个公司相关联。

如果我想在价格上方列出公司名称会怎样?如何在Doctrine中访问该信息,此外,在Twig中?

1 个答案:

答案 0 :(得分:0)

如果我是你,我会将你上面所说的内容翻译成我会有效写的代码:

因此,我认为,除了您定义的映射外,您的公司类别实体被称为“公司_类别”,您的狗粮实体被称为“Dog_food'”。 我会将company_category的id传递给我的控制器中的一个动作, 那么,我会检索属于该company_category的所有公司,如下所示:

public function xyzAction($id){
$companies=$this->getDoctrine()->getRepository('XYZYourBundle:Company')
                ->findBy(array('company_category'=>$id));
//Hold on I will just complete it
}

然后我会从我的数据库中检索所有狗食对象,该公司存在于$ company中,结果在第一行代码中返回, 要做到这一点,我会先:

1 - 定义我自己的标准: 这将有助于您定义复杂,强大的条件,并且易于使用。

2 - 使用我的条件过滤存储库的结果,this会很有用 所以,让我们更新我们的行动:

public function xyzAction($id){

   $companies=$this->getDoctrine()->getRepository('XYZYourBundle:Company')->findBy(array('company_category'=>$id));
   $criteria = new \Doctrine\Common\Collections\Criteria();
   $criteria->where($criteria->expr()->in('company',$companies)); 
   $dogfoods=$this->getDoctrine()->getRepository('XYZYourBundle:Dog_food')->matching($criteria)      
   //Hold on I will just complete it
   }

最后将我们的dogfood对象渲染成树枝模板:

public function xyzAction($id){

   $companies=$this->getDoctrine()->getRepository('XYZYourBundle:Company')->findBy(array('company_category'=>$id));
   $criteria = new \Doctrine\Common\Collections\Criteria();
   $criteria->where($criteria->expr()->in('company',$companies)); 
   $dogfoods=$this->getDoctrine()->getRepository('XYZYourBundle:Dog_food')->matching($criteria)      
   return $this->render('XYZYourBundle:test.html.twig', array(
    'dogfoods'=>$dogfoods));
   }

现在,让我们将ouselves置于树枝模板中,我们将遍历我们的$ dogfoods对象,我们将显示一些信息,假设您定义了所需的getter和setter;

  {% for dogfood in dogfoods %}
     {{dogfood.price}}        
     {{dogfood.company}}
  {% endfor %}

修改: 你可以通过以下方式获得公司的名称:

- 实现一个tostring方法,该方法返回公司的名称并在树枝上使用

{{dogfood.company}}

-in twig,使用

{{dogfood.company.name}}

希望这对你有所帮助,如果有什么不行的,请告诉我。