代码之家  ›  专栏  ›  技术社区  ›  awudarowicz

从Doctrine ORM QueryBuilder中实体的两列中获取数据

  •  0
  • awudarowicz  · 技术社区  · 7 年前

    我在使用条令queryBuilder获取数据时遇到了这样的问题。

    如何更改此SQL:

    SELECT c.*, ct.value as name_pl
    FROM cities c
    LEFT JOIN cities_translations ct ON c.id = ct.city_id AND ct.language_code = 'pl'
    

    (正在从两个表中选择列表数据)

    使用条令查询生成器进入DQL?

    我已经有了这个实体:

    /**
     * @ORM\Entity()
     */
    class City
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue
         */
        public $id
    
        /**
         * @ORM\Column(type="string", length=255)
         */
        public $slug;
    
        /**
         * @ORM\Column(type="string", length=255)
         */
        public $name;
    
        /**
         * @ORM\OneToMany(targetEntity="CityTranslation", mappedBy="city")
         */
        public $translations;
    }
    

    并使用查询生成器进行查询:

    $queryBuilder
            ->select('c, ct.value as name_pl')
            ->from('cities', 'c')
            ->leftJoin('c.translations', 'ct', Join::WITH, 'ct.language_code = pl')
            ->getQuery()
            ->getResult();
    

    其效果是,它从数据库中正确查询数据,但在将数据映射到对象时失败。它返回包含两项的数组(第一项是City对象,第二项是name_pl字符串和值),插入City对象的列表(name_pl作为City对象的字段)

    1 回复  |  直到 7 年前
        1
  •  0
  •   Zahori    7 年前

    尝试:

    $queryBuilder
            ->select('c', 'c')
            ->from('cities', 'c')
            ->leftJoin('c.translations', 'ct', Join::WITH, 'ct.language_code = pl')
            ->addSelect('ct', 'ct')
            ->addSelect('ct.value', 'name_pl')
            ->getQuery()
            ->getResult();