在我的symfony测试项目中,我有两个表,用户与飞行有关。在这种结构中,航班吸引了用户
users
id | name | email |
1 | fen | f.com |
2 | foo | o.com |
flight
id | path | desc | dureation | users|
1 | 123 | xyz | 3 | 1
我在存储库中使用以下查询来提取用户ID为1的所有数据。
class FlightRepository extends \Doctrine\ORM\EntityRepository
{
public function findWithFlights($id)
{
$queryBuilder = $this->createQueryBuilder('u')
->join('u.flights', 'i')
->where('u.id = :id')
->setParameter('id', $id);
return $queryBuilder->getQuery()->getResult();
}
在此情况下,只有在控制器中通过以下命令调用时,以上情况才返回路径飞行场123。
$restresults2 = $this->getDoctrine()
->getRepository('MyBundle:Flights')
->findWithFlights($id);
$response = new Response(json_encode($restresults2));
$response->headers->set('Content-Type', 'application/json');
return $response;
已编辑以显示实体模型
/**
* Users
*
* @ORM\Table()
* @ORM\Entity
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="MyBundle\Repository\UsersRepository")
*/
class Users
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="username", type="string", length=255, nullable=true)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="email", type="string", length=255, nullable=true)
*/
private $email;
getters and setters
/**
* @ORM\OneToMany(targetEntity="Flights", mappedBy="users")
*/
private $flights;
/**
*
*
* @param \MyBundle\Entity\Flights $flights
* @return Users
*/
public function addFlights(\MyBundle\Entity\Flights $flights)
{
$this->flights[] = $flights
return $this;
}
/**
* Get flights
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getFlights()
{
return $this->flights;
}
/**
* Remove Flights
*
* @param \MyBundle\Entity\Flights $flights
*/
public function removeFlights(\MyBundle\Entity\Flights $flights)
{
$this->flights->removeElement($flights);
}
****************** Flights entity **************************8
/**
* Flights
*
* @ORM\Table()
* @ORM\Entity
* @ORM\Table(name="flights")
*/
class Flights
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
public $path;
getters and setters here
/**
* @ORM\ManyToOne(targetEntity="Users", inversedBy="flights")
* @ORM\JoinColumn(name="usersfk", referencedColumnName="id")
*/
private $users;
/**
* Set Users
*
* @param \MyBundle\Entity\Users $users
* @return Flights
*/
public function setUsers(\MyBundle\Entity\Users $users = null)
{
$this->users = $users;
return $this;
}
/**
* Get Users
*
* @return \MyBundle\Entity\Users
*/
public function getUsers()
{
return $this->users;
}
请查询我的回购查询可能有什么问题
答案 0 :(得分:0)
好的,这里有些错误。但首先,您应该问自己:用户和航班是否不应该具有多对多关系?在当前模型中,一个航班只能有一个用户,并且同一用户可以连接到多个航班。你真的想要这个吗?
然后,当您查询时,您应该问自己;我想要用户结果还是航班结果,并在要获取结果的存储库中创建查询构建器。
如果您希望获得用户的所有航班,则应查询以下内容:
class FlightRepository extends \Doctrine\ORM\EntityRepository
{
public function findWithFlights($id)
{
$queryBuilder = $this->createQueryBuilder('f')
->join('f.users', 'u')
->where('u.id = :id')
->setParameter('id', $id);
return $queryBuilder->getQuery()->getResult();
}
答案 1 :(得分:0)
用户字段不存在,因为默认情况下,该理论仅获取属于相应存储库的实体数据。 (选择('u'))。 添加适当的select语句以向Doctrine显示要获取的内容。 我相信您的情况将是select(['u','i'])
class FlightRepository extends \Doctrine\ORM\EntityRepository
{
public function findWithFlights($id) {
$queryBuilder = $this->createQueryBuilder('u')
->select(['u', 'i'])
->join('u.flights', 'i')
->where('u.id = :id')
->setParameter('id', $id);
return $queryBuilder->getQuery()->getResult();
}
}