为了更好地熟悉Symfony2和KnpPaginatorBundle,我设置了一个测试。我有一个带宠物的表,它引用宠物类型(Dog、Cat等)。我可以按照id,name进行排序,但是当我尝试按动物type排序时,我会收到一条错误消息,声明:
在给定的查询组件中,不存在由
我试过各种字段名,但似乎没有用。
实体:MyPets.php
<?php
namespace Xyz\TestBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* MyPet
*/
class MyPet
{
/**
* @var integer
*/
private $id;
/**
* @var string
*/
private $name;
/**
* Set id
*
* @param integer $id
* @return MyPet
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
* @return MyPet
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* @var \Xyz\TestBundle\Entity\AnimalKind
*/
private $AnimalKind;
/**
* Set AnimalKind
*
* @param \Xyz\TestBundle\Entity\AnimalKind $animalKind
* @return MyPet
*/
public function setAnimalKind(\Xyz\TestBundle\Entity\AnimalKind $animalKind)
{
$this->AnimalKind = $animalKind;
return $this;
}
/**
* Get AnimalKind
*
* @return \Xyz\TestBundle\Entity\AnimalKind
*/
public function getAnimalKind()
{
return $this->AnimalKind;
}
}实体:AnimalKind.php
<?php
namespace Xyz\TestBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* AnimalKind
*/
class AnimalKind {
/**
* @var integer
*/
private $id;
/**
* @var string
*/
private $type;
/**
* Get id
*
* @return integer
*/
public function getId() {
return $this->id;
}
/**
* Set type
*
* @param string $type
* @return AnimalKind
*/
public function setType($type) {
$this->type = $type;
return $this;
}
/**
* Get type
*
* @return string
*/
public function getType() {
return $this->type;
}
/**
* @var \Doctrine\Common\Collections\Collection
*/
private $MyPets;
/**
* Constructor
*/
public function __construct() {
$this->MyPets = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add MyPets
*
* @param \Xyz\TestBundle\Entity\MyPet $myPets
* @return AnimalKind
*/
public function addMyPet(\Xyz\TestBundle\Entity\MyPet $myPets) {
$this->MyPets[] = $myPets;
return $this;
}
/**
* Remove MyPets
*
* @param \Xyz\TestBundle\Entity\MyPet $myPets
*/
public function removeMyPet(\Xyz\TestBundle\Entity\MyPet $myPets) {
$this->MyPets->removeElement($myPets);
}
/**
* Get MyPets
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getMyPets() {
return $this->MyPets;
}
public function __toString() {
return $this->getType();
}
}控制器:MyPetController.php (IndexAction)
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery("SELECT a FROM XyzTestBundle:MyPet a");
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate($query,$this->get('request')->query->get('page',
1)/*page number*/,15/*limit per page*/);
return $this->render('XyzTestBundle:MyPet:index.html.twig', array(
'pagination' => $pagination,
));
}视图:MyPet/index.html.twig (剪短)
<table class="records_list">
<thead>
<tr>
{# sorting of properties based on query components #}
<th>{{ knp_pagination_sortable(pagination, 'Id', 'a.id') }}</th>
<th>{{ knp_pagination_sortable(pagination, 'Name', 'a.name') }}</th>
<th>{{ knp_pagination_sortable(pagination, 'kind', 'a.animalkind') }}</th>
</tr>
</thead>
<tbody>
{% for mypet in pagination %}
<tr>
<td><a href="{{ path('xyz_mypet_show', { 'id': mypet.id }) }}">{{ mypet.id }}</a></td>
<td>{{ mypet.name }}</td>
<td>{{ mypet.animalkind }}</td>
</tr>
{% endfor %}
</tbody>
</table>有人能给我一点关于这个问题的见解吗?
发布于 2013-03-16 22:13:30
第一个问题是缺少ORM关系声明;基本上在DB中,YourPet不能与AnimalKind相关联。
您可以找到有关Symfony网站上的实体关系和关联的文档。
从YourPet实体的角度来看,您可能希望使用ManyToOne关系。
第二个问题,一旦您解决了上面的问题,就是您没有在查询中加入AnimalKind实体。
第三个问题是不能按实体排序查询结果。
第一个问题的潜在解决办法:
// In MyPet class
/**
* @var \Xyz\TestBundle\Entity\AnimalKind
* @ORM\OneToMany(targetEntity="AnimalKind", inversedBy="MyPets")
*/
private $AnimalKind;
// In AnimalKind class
/**
* @var \Doctrine\Common\Collections\Collection
* @ORM\ManyToOne(targetEntity="MyPet", inversedBy="AnimalKind")
*/
private $MyPets;第二个问题的潜在解决办法:
$query = $em->createQuery("
SELECT a, k
FROM XyzTestBundle:MyPet a
JOIN a.animalKind k
");第三个问题的潜在解决办法:
<th>{{ knp_pagination_sortable(pagination, 'kind', 'k.type') }}</th>发布于 2016-08-31 15:33:12
要显示没有animalKind的动物,您必须在查询中使用左联接
$query = $em->createQuery("
SELECT a, k
FROM XyzTestBundle:MyPet a
LEFT JOIN a.animalKind k
");发布于 2022-05-30 10:46:55
对于那些使用和DQL并仍在寻找答案的人:
$qb = $this->createQueryBuilder('a');
$qb->select('a', 'k')
->leftJoin(
'a.animalKind',
'k'
)
;假设->,您在实体中正确地创建了关系。
https://stackoverflow.com/questions/15452393
复制相似问题