根据Symfony2中的两个ManyToOne关系过滤结果

时间:2015-06-05 14:11:15

标签: symfony doctrine many-to-one

在下面的示例中,$ type可以是“品牌”或“类别”,$ slug可以是品牌或类别。

当我想同时过滤某个类别和品牌的结果时,我该如何处理?

    public function getGroupAction($slug, $type = null, $grouped = true)
{

    $group = $this->getDoctrine()
        ->getRepository('AudsurShopBundle:'.$type)
        ->findOneBy(array( 'name' => $slug ))
        ->getProducts();

    return $this->render('AudsurShopBundle:Default:productOverview.html.twig', array(
            'group' => $group
        )
    );

}

1 个答案:

答案 0 :(得分:0)

要做你想做的事,你必须使用Class table inheritance和一个鉴别器列系统。

对于您的示例,请创建以下实体:

<?php

namespace ...

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discriminator", type="string")
 * @ORM\DiscriminatorMap({"category" = "Category", "brand" = "Brand"})
 */
abstract class NameHolder
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    // Getters and setters
}

然后让你的2个实体继承这个类:

<?php

namespace ...;

use Doctrine\ORM\Mapping as ORM;

/**
 * FirstChild
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Category extends NameHolder
{
    // all methods and properties except from the "name"
}

<?php

namespace ...;

use Doctrine\ORM\Mapping as ORM;

/**
 * FirstChild
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Brand extends NameHolder
{
    // all methods and properties except from the "name"
}

所以现在你可以这样做一个查询:

$group = $this->getDoctrine()
    ->getRepository('AudsurShopBundle:NameHolder')
    ->findOneBy(array('name' => $slug))
    ->getProducts();

这将返回包含BrandCategory个实体的数组集合。

但是我不确定NameHolder课程是否真的有意义。另一个解决方案是在不更改任何实体的情况下对两个实体进行单独查询,但这不是您想要查找的内容。