MySQL / Doctrine:查找具有相同名称的项目的子项

时间:2017-06-12 11:56:41

标签: mysql symfony doctrine-orm

我有三个Doctrine实体类,我们称之为Top,Middle和Bottom。

Top与中间人有一对多的关系,中间人与底部有一对多的关系。

Middle有一个属性“name”。这个“名称”不一定是唯一的。

现在我正在尝试显示“middles”列表。所有具有相同名称的中间应该被分组(在列表中只出现一次)。

在每个列表项下,应预览相关的底部(例如最多5个)

实施例

数据库内容:

Top Lorem:
   - Middle Foo
        - Bottom Dolor
        - Bottom Sit
        - Bottom Amet
   - Middle Bar
        - Bottom Elit

Top Ipsum:
   - Middle Foo
        - Bottom Aenean 
        - Bottom Comodo
   - Middle Baz
        - Bottom Aenean
预期结果:
- Middle Foo
    - Bottom Dolor
    - Bottom Sit
    - Bottom Amet
    - Bottom Aenean
- Middle Bar
    - Bottom Elit 
- Middle Baz
    - Bottom Aenean

以下是使用doctrine annotations描述的三个类:

/**
 * Handelsunternehmen
 *
 * @ORM\Table(name="top")
 * @ORM\Entity(repositoryClass="Bundle\Repository\TopRepository")
 */
class Top extends Client
{

    /**
     * @var ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="Bundle\Entity\Middle", mappedBy="top", cascade={"persist"})
     */
    private $middles;

    ...
}

中东

/**
 * Middle
 *
 * @ORM\Table(name="middle")
 * @ORM\Entity(repositoryClass="Bundle\Repository\MiddleRepository")
 */
class Vertriebsschiene
{
    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=100)
     */
    private $name;


    /**
     * @var Top
     *
     * @ORM\ManyToOne(targetEntity="Bundle\Entity\Top")
     * @ORM\JoinColumn(name="top_id", referencedColumnName="id")
     */
    private $top;

    /**
     * @var ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="Bottom", mappedBy="middle")
     */
    private $bottoms;

    ...
}
底部
/**
 * Bottom
 *
 * @ORM\Table(name="bottom")
 * @ORM\Entity(repositoryClass="Bundle\Repository\BottomRepository")
 */
class Bottom extends Lieferant
{
    /**
     * @var string
     *
     * @Gedmo\Slug(fields={"adressCity", "adressStreet"})
     * @ORM\Column(length=128, unique=true)
     */
    protected $slug;

     /**
      * @var Middle
      *
      * @ORM\ManyToOne(targetEntity="Bundle\Entity\Middle", inversedBy="bottoms")
      * @ORM\JoinColumn(name="middle_id", referencedColumnName="id")
      */
     private $middle;

     ...
 }

目前,我通过以下方法检索中间对象列表:

public function findAllQuery(){

    $qb = $this->createQueryBuilder('m')
        ->select('m as middle', 'b as bottom')
        ->addSelect('COUNT(b) as bottom_count')
        ->leftJoin('m.bottoms', 'b')
        ->groupBy('m.name');

    return $qb->getQuery();
}

我遇到的问题是,bottom_count显示了正确数量的相关底部,但当我访问middle.bottoms时,我只得到一个结果。

任何人都可以提供任何帮助吗?我被困了一个星期。

0 个答案:

没有答案