Symfony2使用自联接获取类别和子类别

Symfony2使用自联接获取类别和子类别,symfony,doctrine-orm,Symfony,Doctrine Orm,大家好,我有一个小问题,我想获取我所有的根类别和子类别,并在细枝中列出它 我的数据库表如下所示: +----+----------+------------------+--------+ | ID | Parent | Name | Status | +----+----- ----+------------------+--------+ | 1 | | Electronics | 1 | | 2 | 1 |

大家好,我有一个小问题,我想获取我所有的根类别和子类别,并在细枝中列出它

我的数据库表如下所示:

+----+----------+------------------+--------+
| ID | Parent   |      Name        | Status |
+----+----- ----+------------------+--------+
| 1  |          | Electronics      |   1    |
| 2  |   1      | Camcorders       |   1    |
| 3  |   1      | Computers        |   1    |
| 4  |   1      | TV Audio         |   1    |
| 5  |          | Motors           |   1    |
| 6  |   5      | Cars & Trucks    |   1    |
| 7  |   5      | Motorcycles      |   1    |
| 8  |   5      | Boats            |   1    |
+----+----------+------------------+--------+
|—Electronics 
   |—  Camcorders   
   |—  Computers
   |—  TV Audio     
|—Motors                 
   |—  Cars & Trucks
   |—  Motorcycles
   |—  Boats
  public function getAllCategoriesByName()
    {
        return $this->getEntityManager()
            ->createQuery(
                'SELECT c FROM ISLabECommerceBundle:Category c WHERE c.parent IS NULL '
            )
            ->getResult();
    }
$em = $this->container->get('doctrine');
$categories = $em->getRepository('ISLabECommerceBundle:Category')->getAllCategoriesByName();
<ul>
{% for category in categories %}
    <li><a href='#'><span>{{ category.name }}</span></a></li>
{% endfor %}
</ul>
根类别没有父类别且具有空值,所有子类别都包含根类别的ID

树看起来像这样:

+----+----------+------------------+--------+
| ID | Parent   |      Name        | Status |
+----+----- ----+------------------+--------+
| 1  |          | Electronics      |   1    |
| 2  |   1      | Camcorders       |   1    |
| 3  |   1      | Computers        |   1    |
| 4  |   1      | TV Audio         |   1    |
| 5  |          | Motors           |   1    |
| 6  |   5      | Cars & Trucks    |   1    |
| 7  |   5      | Motorcycles      |   1    |
| 8  |   5      | Boats            |   1    |
+----+----------+------------------+--------+
|—Electronics 
   |—  Camcorders   
   |—  Computers
   |—  TV Audio     
|—Motors                 
   |—  Cars & Trucks
   |—  Motorcycles
   |—  Boats
  public function getAllCategoriesByName()
    {
        return $this->getEntityManager()
            ->createQuery(
                'SELECT c FROM ISLabECommerceBundle:Category c WHERE c.parent IS NULL '
            )
            ->getResult();
    }
$em = $this->container->get('doctrine');
$categories = $em->getRepository('ISLabECommerceBundle:Category')->getAllCategoriesByName();
<ul>
{% for category in categories %}
    <li><a href='#'><span>{{ category.name }}</span></a></li>
{% endfor %}
</ul>
注意:我不需要嵌套的集合数据(树数据),这棵树只是一个例子

我想在twig中显示所有这些,如以下下拉菜单:

+---------------------+--------+
| Electroics          | Motors |
+---------------------+--------+
  | Camcorders |
  +------------+
  | Computers  |
  +------------+
  | TV Audio   |
  +------------+
获取所有根目录的存储库方法:

+----+----------+------------------+--------+
| ID | Parent   |      Name        | Status |
+----+----- ----+------------------+--------+
| 1  |          | Electronics      |   1    |
| 2  |   1      | Camcorders       |   1    |
| 3  |   1      | Computers        |   1    |
| 4  |   1      | TV Audio         |   1    |
| 5  |          | Motors           |   1    |
| 6  |   5      | Cars & Trucks    |   1    |
| 7  |   5      | Motorcycles      |   1    |
| 8  |   5      | Boats            |   1    |
+----+----------+------------------+--------+
|—Electronics 
   |—  Camcorders   
   |—  Computers
   |—  TV Audio     
|—Motors                 
   |—  Cars & Trucks
   |—  Motorcycles
   |—  Boats
  public function getAllCategoriesByName()
    {
        return $this->getEntityManager()
            ->createQuery(
                'SELECT c FROM ISLabECommerceBundle:Category c WHERE c.parent IS NULL '
            )
            ->getResult();
    }
$em = $this->container->get('doctrine');
$categories = $em->getRepository('ISLabECommerceBundle:Category')->getAllCategoriesByName();
<ul>
{% for category in categories %}
    <li><a href='#'><span>{{ category.name }}</span></a></li>
{% endfor %}
</ul>
控制器:

+----+----------+------------------+--------+
| ID | Parent   |      Name        | Status |
+----+----- ----+------------------+--------+
| 1  |          | Electronics      |   1    |
| 2  |   1      | Camcorders       |   1    |
| 3  |   1      | Computers        |   1    |
| 4  |   1      | TV Audio         |   1    |
| 5  |          | Motors           |   1    |
| 6  |   5      | Cars & Trucks    |   1    |
| 7  |   5      | Motorcycles      |   1    |
| 8  |   5      | Boats            |   1    |
+----+----------+------------------+--------+
|—Electronics 
   |—  Camcorders   
   |—  Computers
   |—  TV Audio     
|—Motors                 
   |—  Cars & Trucks
   |—  Motorcycles
   |—  Boats
  public function getAllCategoriesByName()
    {
        return $this->getEntityManager()
            ->createQuery(
                'SELECT c FROM ISLabECommerceBundle:Category c WHERE c.parent IS NULL '
            )
            ->getResult();
    }
$em = $this->container->get('doctrine');
$categories = $em->getRepository('ISLabECommerceBundle:Category')->getAllCategoriesByName();
<ul>
{% for category in categories %}
    <li><a href='#'><span>{{ category.name }}</span></a></li>
{% endfor %}
</ul>
小枝:

+----+----------+------------------+--------+
| ID | Parent   |      Name        | Status |
+----+----- ----+------------------+--------+
| 1  |          | Electronics      |   1    |
| 2  |   1      | Camcorders       |   1    |
| 3  |   1      | Computers        |   1    |
| 4  |   1      | TV Audio         |   1    |
| 5  |          | Motors           |   1    |
| 6  |   5      | Cars & Trucks    |   1    |
| 7  |   5      | Motorcycles      |   1    |
| 8  |   5      | Boats            |   1    |
+----+----------+------------------+--------+
|—Electronics 
   |—  Camcorders   
   |—  Computers
   |—  TV Audio     
|—Motors                 
   |—  Cars & Trucks
   |—  Motorcycles
   |—  Boats
  public function getAllCategoriesByName()
    {
        return $this->getEntityManager()
            ->createQuery(
                'SELECT c FROM ISLabECommerceBundle:Category c WHERE c.parent IS NULL '
            )
            ->getResult();
    }
$em = $this->container->get('doctrine');
$categories = $em->getRepository('ISLabECommerceBundle:Category')->getAllCategoriesByName();
<ul>
{% for category in categories %}
    <li><a href='#'><span>{{ category.name }}</span></a></li>
{% endfor %}
</ul>
    {categories%%中的类别为%s}
  • {%endfor%}
现在我需要使用JOIN来显示类别电子产品的所有子类别,但我不知道该怎么做。我对join、left/right join的过期率较低。Any1可以给我一个示例,说明如何获取所有根目录并显示Any1根目录的子类别

更新:

+----+----------+------------------+--------+
| ID | Parent   |      Name        | Status |
+----+----- ----+------------------+--------+
| 1  |          | Electronics      |   1    |
| 2  |   1      | Camcorders       |   1    |
| 3  |   1      | Computers        |   1    |
| 4  |   1      | TV Audio         |   1    |
| 5  |          | Motors           |   1    |
| 6  |   5      | Cars & Trucks    |   1    |
| 7  |   5      | Motorcycles      |   1    |
| 8  |   5      | Boats            |   1    |
+----+----------+------------------+--------+
|—Electronics 
   |—  Camcorders   
   |—  Computers
   |—  TV Audio     
|—Motors                 
   |—  Cars & Trucks
   |—  Motorcycles
   |—  Boats
  public function getAllCategoriesByName()
    {
        return $this->getEntityManager()
            ->createQuery(
                'SELECT c FROM ISLabECommerceBundle:Category c WHERE c.parent IS NULL '
            )
            ->getResult();
    }
$em = $this->container->get('doctrine');
$categories = $em->getRepository('ISLabECommerceBundle:Category')->getAllCategoriesByName();
<ul>
{% for category in categories %}
    <li><a href='#'><span>{{ category.name }}</span></a></li>
{% endfor %}
</ul>
实体

<?php

namespace ISLab\Bundle\ECommerceBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
 * Category
 *
 * @ORM\Table(name="ecomerce_categories")
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Entity(repositoryClass="ISLab\Bundle\ECommerceBundle\Repository\CategoryRepository")
 */
class Category
{
    /**
     * @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;

    /**
     * @var integer
     *
     * @ORM\Column(name="image", type="integer")
     */
    private $image;

    /**
     * @var category
     *
     * @ORM\OneToMany(targetEntity="category", mappedBy="parent")
     */
    private $children;

    /**
     * @var ArrayCollection
     *
     * @ORM\ManyToOne(targetEntity="category", inversedBy="children")
     * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $parent;

    /**
     * @var integer
     *
     * @ORM\Column(name="status", type="integer")
     */
    private $status;

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

    /**
     * @var string
     *
     * @ORM\Column(name="meta_keywords", type="text")
     */
    private $metaKeywords;

    /**
     * @var string
     *
     * @ORM\Column(name="meta_description", type="text")
     */
    private $metaDescription;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="text")
     */
    private $description;
    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_created", type="datetime")
     */
    private $dateCreated;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_modified", type="datetime")
     */
    private $dateModified;

    /**
     * Constructor
     *
     * ArrayCollection
     */
    public function __construct()
    {
        $this->children = new ArrayCollection();
    }

    /**
     * To String
     *
     * @return string
     */
    public function __toString()
    {
        return (string) $this->name;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Category
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set image
     *
     * @param integer $image
     * @return Category
     */
    public function setImage($image)
    {
        $this->image = $image;

        return $this;
    }

    /**
     * Get image
     *
     * @return integer 
     */
    public function getImage()
    {
        return $this->image;
    }

    /**
     * Set parent
     *
     * @param integer $parent
     * @return Category
     */
    public function setParent($parent)
    {
        $this->parent = $parent;

        return $this;
    }

    /**
     * Get parent
     *
     * @return integer 
     */
    public function getParent()
    {
        return $this->parent;
    }

    /**
     * Set status
     *
     * @param integer $status
     * @return Category
     */
    public function setStatus($status)
    {
        $this->status = $status;

        return $this;
    }

    /**
     * Get status
     *
     * @return integer 
     */
    public function getStatus()
    {
        return $this->status;
    }

    /**
     * Set pageTitle
     *
     * @param string $pageTitle
     * @return Category
     */
    public function setPageTitle($pageTitle)
    {
        $this->pageTitle = $pageTitle;

        return $this;
    }

    /**
     * Get pageTitle
     *
     * @return string 
     */
    public function getPageTitle()
    {
        return $this->pageTitle;
    }

    /**
     * Set metaKeywords
     *
     * @param string $metaKeywords
     * @return Category
     */
    public function setMetaKeywords($metaKeywords)
    {
        $this->metaKeywords = $metaKeywords;

        return $this;
    }

    /**
     * Get metaKeywords
     *
     * @return string 
     */
    public function getMetaKeywords()
    {
        return $this->metaKeywords;
    }

    /**
     * Set metaDescription
     *
     * @param string $metaDescription
     * @return Category
     */
    public function setMetaDescription($metaDescription)
    {
        $this->metaDescription = $metaDescription;

        return $this;
    }

    /**
     * Get metaDescription
     *
     * @return string 
     */
    public function getMetaDescription()
    {
        return $this->metaDescription;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return Category
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Set dateCreated
     *
     * @ORM\PrePersist
     *
     * @return Category
     */
    public function setDateCreated()
    {
        $this->dateCreated = new \DateTime();

        return $this;
    }

    /**
     * Get dateCreated
     *
     * @return \DateTime
     */
    public function getDateCreated()
    {
        return $this->dateCreated;
    }

    /**
     * Set dateModified
     *
     * @ORM\PrePersist
     * @ORM\PreUpdate
     *
     * @return Category
     */
    public function setDateModified()
    {
        $this->dateModified =  new \DateTime();

        return $this;
    }

    /**
     * Get dateModified
     *
     * @return \DateTime
     */
    public function getDateModified()
    {
        return $this->dateModified;
    }

}

首先修改实体,如下所示

public function setChildren($children) { //this will be an array collection so please pay attention
  $this->children = $children;

  return $this;
}

public function getChildren() {
  return $this->children;
}
您还应该更改变量名,因为
children
将是
数组集合
,因此我建议在
childrens
中更改它(因为代码语义更好)

然后,您可以直接在细枝中迭代子对象

<ul>
{% for category in categories %}
    <li><a href='#'><span>{{ category.name }}</span></a></li>
    <ul>
    {% for sub_category in category.children %}
        <li><a href='#'><span>{{ sub_category.name }}</span></a></li>
    {% endfor %}
    </ul>
{% endfor %}
</ul>
    {categories%%中的类别为%s}
    • {category.children%}
    • {%endfor%}
    {%endfor%}
教义会为你们做这件事,因为你们的实体是通过孩子和父母的关系与自身“联系”在一起的。在twig中调用
category.children
时,将调用
getChildren()
方法


就这些

你能给我们显示类别实体吗?现在检查我的新更新我想要结果获取类别和子类别,就像关于什么的一样?不,我不需要这里的嵌套集。我已经使用了条令扩展和stfo Bundle dor。Deam那个条令。又一个问题出现在教义及其魔力中:)他令人惊讶,他自动调用getChildren()。谢谢你的工作good@Ikac:是的,ORM非常有用:)