News使用一对多的自引用方法相互关联(一个消息是父消息,可以有多个子消息)。更重要的是 each与和News具有正常的(非自引用的)一对一关系。当我运行简单的 DQL 时:EventGallery
SELECT n FROM App\Entity\News n WHERE n.parent = :id
然后通过设置getResults默认值的方法对结果进行水合HYDRATION_OBJECT,在方法内部的某处进行额外的查询getResults。
SELECT t0.* FROM event t0 WHERE t0.news_id = 2 AND ((t0.deleted_at IS NULL));
SELECT t0.* FROM gallery t0 WHERE t0.news_id = 2 AND ((t0.deleted_at IS NULL));
SELECT t0.* FROM event t0 WHERE t0.news_id = 1 AND ((t0.deleted_at IS NULL));
SELECT t0.* FROM gallery t0 WHERE t0.news_id = 1 AND ((t0.deleted_at IS NULL));
第一次查询选择的新闻的孩子在哪里和在哪里news_id = 1。news_id = 2
News也没有自引用的一对多关系(我在这里忽略了它们),但是 hydration 没有对它们进行额外的查询。parent仅当语句中涉及关系时才会出现此问题where。
如何重现
// news Entity
/**
* @ORM\Entity(repositoryClass="App\Repository\NewsRepository")
* @ORM\Table(uniqueConstraints={@UniqueConstraint(name="news_slug_deleted", columns={"slug","deleted_at"})})
*
class News {
use SoftDeleteableEntity;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $title;
/**
* @Gedmo\Slug(fields={"title"})
* @ORM\Column(length=128)
*/
private $slug;
/**
* @ORM\OneToOne(targetEntity="App\Entity\Gallery", mappedBy="news", cascade={"persist", "remove"}, orphanRemoval=true)
*
* @var Gallery
*/
private $gallery;
/**
* @ORM\OneToOne(targetEntity="App\Entity\Event", mappedBy="news", cascade={"persist", "remove"}, orphanRemoval=true)
*
* @var Event
*/
private $event;
/**
* One News has Many News.
* @ORM\OneToMany(targetEntity="News", mappedBy="parent")
*/
private $children;
/**
* Many News have One News.
* @ORM\ManyToOne(targetEntity="News", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", nullable=true)
*/
private $parent;
}
慕娘9325324