gpt4 book ai didi

symfony - 学说 : select a table that is not managed by doctrine

转载 作者:行者123 更新时间:2023-12-02 20:06:39 24 4
gpt4 key购买 nike

使用 Doctrine QueryBuilder,我想执行一个在原生 SQL 中看起来像这样的查询:

`SELECT image FROM image i INNER JOIN about_images a ON i.id = a.image_id`;

DQL中的结果如下:

ImageRepository.php:

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

其中 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;

来自图像实体的字段:

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

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

最佳答案

您可以编写 native 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();
}

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

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

关于symfony - 学说 : select a table that is not managed by doctrine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54462169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com