在 Symfony2 中使用带有外键的 Doctrine2
Using Doctrine2 with Foreign Keys in Symfony2
我有一个 MySQL 数据库(后来导入到 Doctrine 中)设置它通过外键链接 3 个不同的 table。关系如下:许多A去一个B,许多B去一个C。对于我要创建的网页,我需要一些关于A的页面上的相关B的信息,同时被归类为C.
可以这样想:A 是 "dog_food",B 是 "company",C 是 "company_category"。也就是说,在一个显示不同种类狗粮的页面上,我需要显示制造公司的信息;我只根据用户指定他们想从哪种公司购买的方式来显示那些狗粮。
从 A 动态拉取信息很简单,因为存储库已拉取并且行作为实体存在。比如说,{{ dog_food.price }}
会调用(如果在 for
循环中指定,这是 Twig 代码)单个实例的价格。
我已经阅读了有关@OneToOne、@OneToMany 等注释的信息,但未能找到一种方法来轻松地在 Twig 模板中利用它们的效果。所有 3 table 的聚合实体和存储库作为控制器中的变量存在。需要说明的是,继续这个例子,tableB中有一个companyID字段对应多个狗粮,一个categoryID对应多个公司。
如果我想在价格上方列出公司名称会怎样?我如何在 Doctrine 以及 Twig 中访问该信息?
如果我是你,我会把你上面所说的翻译成我会有效编写的代码:
因此,我假设,连同您定义的映射,您的公司类别实体称为 'Company_category',您的狗粮实体称为 '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
}
然后我将从我的数据库中检索所有狗食对象,该公司存在于 $companies 中,结果在第一行代码中返回,
为此,我首先要:
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 对象渲染到一个 twig 模板:
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 放在一个 twig 模板中,我们将遍历我们的 $dogfoods 对象,我们将显示一些信息,假设您定义了所需的 getter 和 setter;
{% for dogfood in dogfoods %}
{{dogfood.price}}
{{dogfood.company}}
{% endfor %}
编辑:
您可以通过以下任一方式获取公司名称:
-实现一个 tostring 方法,returns 公司名称和 twig 使用
{{dogfood.company}}
或
-在树枝中,使用
{{dogfood.company.name}}
希望这对你有帮助,如果有什么不对请告诉我。
我有一个 MySQL 数据库(后来导入到 Doctrine 中)设置它通过外键链接 3 个不同的 table。关系如下:许多A去一个B,许多B去一个C。对于我要创建的网页,我需要一些关于A的页面上的相关B的信息,同时被归类为C.
可以这样想:A 是 "dog_food",B 是 "company",C 是 "company_category"。也就是说,在一个显示不同种类狗粮的页面上,我需要显示制造公司的信息;我只根据用户指定他们想从哪种公司购买的方式来显示那些狗粮。
从 A 动态拉取信息很简单,因为存储库已拉取并且行作为实体存在。比如说,{{ dog_food.price }}
会调用(如果在 for
循环中指定,这是 Twig 代码)单个实例的价格。
我已经阅读了有关@OneToOne、@OneToMany 等注释的信息,但未能找到一种方法来轻松地在 Twig 模板中利用它们的效果。所有 3 table 的聚合实体和存储库作为控制器中的变量存在。需要说明的是,继续这个例子,tableB中有一个companyID字段对应多个狗粮,一个categoryID对应多个公司。
如果我想在价格上方列出公司名称会怎样?我如何在 Doctrine 以及 Twig 中访问该信息?
如果我是你,我会把你上面所说的翻译成我会有效编写的代码:
因此,我假设,连同您定义的映射,您的公司类别实体称为 'Company_category',您的狗粮实体称为 '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
}
然后我将从我的数据库中检索所有狗食对象,该公司存在于 $companies 中,结果在第一行代码中返回, 为此,我首先要:
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 对象渲染到一个 twig 模板:
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 放在一个 twig 模板中,我们将遍历我们的 $dogfoods 对象,我们将显示一些信息,假设您定义了所需的 getter 和 setter;
{% for dogfood in dogfoods %}
{{dogfood.price}}
{{dogfood.company}}
{% endfor %}
编辑: 您可以通过以下任一方式获取公司名称:
-实现一个 tostring 方法,returns 公司名称和 twig 使用
{{dogfood.company}}
或
-在树枝中,使用
{{dogfood.company.name}}
希望这对你有帮助,如果有什么不对请告诉我。