如何加入多对多的关系

时间:2013-12-06 07:18:11

标签: mysql symfony doctrine-orm

实体:

  • 模型
  • 分类
  • 关键字

模型与关键字有很多关系,类别与关键字有很多关系。

orm生成以下表格

  • 模型
  • 类别
  • 关键字
  • keyword_model
  • keyword_category

当给出类别时,我如何获得与此类别相关的所有模型?我会这样做

  • 按category.id
  • 从keyword_category获取所有关键字ID
  • 将结果与keyword_model表
  • 结合使用
  • 连接的结果应该是所有相关的模型ID

由于symfony2处理实体而不是表,因此创建mysql查询似乎很难。我试过像

这样的东西
SELECT x,y FROM MyBundle:Category x, MyBundle:Model y
        JOIN x.keywords
        JOIN y.keywords
            WHERE
                x.id = " . $category . " 

然而这是无效的mysql语法。有关如何在这里获得模型的任何想法吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

SELECT 
   y 
FROM 
    MyBundle:Model y
WHERE
    EXISTS (
        SELECT
            x
        FROM
            MyBundle:Category x
        JOIN
            x.keywords xk
        WHERE
            xk MEMBER OF y.keywords AND
            x = :category
    )

或者如果您的关系是bidirectional

SELECT 
   y 
FROM 
    MyBundle:Model y
JOIN
    y.keywords yk
JOIN
    yk.categories c
WHERE
    c = :category

答案 1 :(得分:1)

从给定的类别(我想你有id)

$category_repo = $this->getDoctrine()->getManager()->getRepository('YourBundleName:Category');
$category = $category_repo->findOneById($id); //$id is your entity id
$keywords = $category->getKeywords(); //getKeywords() is the name of the method that you should have inside your class
$models = new ArrayCollection(); //or use a simple array
foreach($keywords as $keyword) {
  foreach($keyword->getModels() as $model) {
    $models->add($model);
  }
}

但是直接使用sql应该更好,因为你将为每个对象执行单个查询而不是查询(延迟加载概念)