简体   繁体   English

查询未获取相关表中的所有结果

[英]query is not fetching all the results in related tables

In my symfony test project I have two tables whereby users is related to flight. 在我的symfony测试项目中,我有两个表,用户与飞行有关。 Flight has fk to users in this structure 在这种结构中,航班已经吸引了用户

users

id | name | email |
1  | fen  | f.com |
2  | foo  | o.com |

flight
id | path | desc | dureation | users|
1  | 123  | xyz  | 3         | 1

I am using below query in a repository to pull for all the data where user id is 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();
}

the above only returns flight field of path in this case 123 when called with the below in controller 当在控制器中使用以下命令调用时,上面的命令仅返回这种情况下的路径飞行场123

$restresults2 = $this->getDoctrine()
            ->getRepository('MyBundle:Flights')
                ->findWithFlights($id);
$response = new Response(json_encode($restresults2));
        $response->headers->set('Content-Type', 'application/json');

return $response;

editted to show entity models 编辑以显示实体模型

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

Please what could be wrong with my repo query 请问我的回购查询可能有什么问题

Ok, there are some things wrong here. 好的,这里有些问题。 But first of all, you should ask yourself: should users and flight not have a many-to-many realtionship? 但首先,您应该问自己:用户和航班是否不应该具有多对多关系? In your current model one flight can only have one user, and the same user can be connected to many flights. 在当前模型中,一个航班只能有一个用户,并且同一用户可以连接到多个航班。 Do you really want this? 你真的想要这个吗?

Then when you query, you should ask yourself; 然后,当您查询时,您应该问自己: do I want a result of users or a result of flight and create your query builder in the repository you want to have your results of. 我想要用户结果还是航班结果,并在要获取结果的存储库中创建查询构建器。

If you want all the flights of a user this should be your query: 如果您希望获得用户的所有航班,则应查询以下内容:

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

User fields are not there cause by default doctrine is fetching only entity data that belongs to the corresponding repository. 用户字段不存在,因为默认情况下,该理论仅获取属于相应存储库的实体数据。 (select('u')). (选择('u'))。 Add a proper select statement to show Doctrine what you want to fetch. 添加适当的select语句以向Doctrine显示要获取的内容。 I believe in your case it would be select(['u', 'i']) 我相信您的情况将是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();
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM