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非常有用:)