Doctrine:选择不受doctrine管理的表

Hel*_*esh 2 symfony doctrine-orm

使用 Doctrine QueryBuilder,我想执行一个查询,在本机 SQL 中如下所示:

`SELECT image FROM image i INNER JOIN about_images a ON i.id = a.image_id`;
Run Code Online (Sandbox Code Playgroud)

DQL中的结果如下:

图像库.php

return $this->createQueryBuilder('i')
        ->select('i')
        ->innerJoin('about_images', 'a', 'WITH', 'i.id = a.imageId')
        ->getQuery()
        ->getResult();
Run Code Online (Sandbox Code Playgroud)

其中image是实体,about_images是连接表(关系的结果@ManyToMany)。然而,我得到了未定义的错误about_images,这是有道理的,因为它不是由学说管理的。

AboutPage.php(即创建联接表的实体)

  /**
     * @var Image[]|ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity="App\Entity\Image", cascade={"persist", "remove"})
     * @ORM\JoinTable(name="about_images",
     *     joinColumns={@ORM\JoinColumn(name="about_id", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="image_id", referencedColumnName="id", unique=true)})
   */
    private $images;
Run Code Online (Sandbox Code Playgroud)

来自图像实体的字段:

    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(type="string", length=255)
     */
    private $image;

    /**
     * @var File
     *
     * @Vich\UploadableField(mapping="collection_images", fileNameProperty="image")
     * @Assert\File(maxSize="150M", mimeTypes={"image/jpeg", "image/jpg", "image/png", "image/gif"},
     *     mimeTypesMessage="The type ({{ type }}) is invalid. Allowed image types are {{ types }}")
     */
    private $imageFile;

    /**
     * @var string
     *
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $imageAlt;

    /**
     * @var DateTime
     *
     * @ORM\Column(type="datetime")
     */
    private $updatedAt;

    /**
     * @var string
     *
     * @ORM\Column(type="string", nullable=true)
     */
    private $alt;
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?结果应该是Image实体。

dbr*_*ann 6

您可以编写本机 SQL,然后使用 ResultSetMapper 将输出映射到您的实体。

对于您的示例,它在您的 Repository 类中可能看起来像这样:

public function findImagesWithAboutImages()
{
    $sql = 'SELECT i.* FROM image i INNER JOIN about_images a ON i.id = a.image_id';
    $entityManager = $this->getEntityManager();

    $mappingBuilder = new ResultSetMappingBuilder($entityManager);
    $mappingBuilder->addRootEntityFromClassMetadata(Image::class, 'i');

    $query = $entityManager->createNativeQuery($sql, $mappingBuilder);
    // If you want to set parameters e.g. you have something like WHERE id = :id you can do it on this query object using setParameter()

    return $query->getResult();
}
Run Code Online (Sandbox Code Playgroud)

如果您想要相关数据,您必须将其添加到带有别名的 select 子句中,然后使用$mappingBuilder->addJoinedEntityFromClassMetadata()这些字段分配给连接的实体,就像上面使用根实体一样。

实体中的注释已经定义了每个字段如何映射到属性及其类型,因此基本上您应该获得一个图像实体数组,其中所有内容(但相关实体除外)加载可用。