首页 > 解决方案 > 查询未获取相关表中的所有结果

问题描述

在我的 symfony 测试项目中,我有两个表,用户与航班相关。在这种结构中,Flight 对用户有 fk

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;
    }

请问我的回购查询有什么问题

标签: phpsymfony

解决方案


好的,这里有一些问题。但首先,你应该问自己:用户和航班不应该是多对多的关系吗?在您当前的模型中,一个航班只能有一个用户,而同一个用户可以连接到多个航班。你真的想要这个吗?

那么当你查询时,你应该问自己;我想要用户的结果还是飞行的结果,并在您想要获得结果的存储库中创建您的查询构建器。

如果您想要用户的所有航班,这应该是您的查询:

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();
}

推荐阅读