我正在尝试基本上运行类似子查询的东西,以根据基本连接条件自动水合实体集合。 我不完全确定只有学说注释才有可能,但我还是想问。
所以我有一个名为“Page”的实体,它有点像CMS条目。这些页面可以包含与其相关联的图像的可变列表。基本上它只是另一个带有page_id列的表。该表可以将任意数量的图像与通过排序排列的相同page_id相关联。此实体称为PageImage。
我基本上只是一个带有Doctrine的菜鸟,而且@Join注释指令现在让我旋转。
因此,加载单个页面实体,并使用PageImage实体数组自动填充查询的Page对象中的单个属性。 PageEntity有一个page_id字段。
我真的没有任何代码可以在这里分享,因为这是一个方法问题。但是让我们看看:
实体/ page.php文件
/**
* Page
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Site\CoreBundle\Entity\PageRepository")
*/
class Page
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="page_title", type="string", length=255)
*/
private $pageTitle;
/**
* @var string
*
* @Gedmo\Slug(fields={"pageTitle"})
* @ORM\Column(name="slug", type="string", length=255)
*/
private $slug;
// NOT SURE WHAT TO DO HERE
private $images;
}
实体/ PageImage.php
/**
* PageImage
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Site\CoreBundle\Entity\PageImageRepository")
*/
class PageImage
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="page_id", type="string", length=255)
*/
private $page_id;
/**
* @var string
*
* @Assert\File(maxSize="6000000")
* @ORM\Column(name="file", type="string", length=512)
*/
private $file;
/**
* @var \DateTime
*
* @ORM\Column(name="dateAdded", type="datetime")
*/
private $dateAdded;
/**
* @var integer
*
* @ORM\Column(name="sort", type="integer")
*/
private $sort;
}
答案 0 :(得分:1)
您必须在一方通过 Page.Images 建立实体之间的关系,而在另一方通过 PageImage.page_id 建立关系。我会将其作为 OneToMany 关系(一个 Page 可以有多个 PageImage )。查看documentation。
代码:
页面实体:
/**
* @OneToMany(targetEntity="PageImage", mappedBy="page_id")
**/
private $images;
public function __construct() {
$this->images = new \Doctrine\Common\Collections\ArrayCollection();
}
PageImage实体:
/**
* @ManyToOne(targetEntity="Page", inversedBy="images")
* @JoinColumn(name="page_id", referencedColumnName="id")
**/
private $page_id;
使用这些设置,Doctrine将处理连接,它将自动使用 PageImage 相关项填充页面。
答案 1 :(得分:0)
在PageImage实体
中use Doctrine\Common\Collections\ArrayCollection;
/**
* PageImage
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Site\CoreBundle\Entity\PageImageRepository")
*/
class PageImage
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Page", inversedBy="images")
* @ORM\JoinColumn(name="page_id", referencedColumnName="id")
*/
private $page;
/**
* @var string
*
* @Assert\File(maxSize="6000000")
* @ORM\Column(name="file", type="string", length=512)
*/
private $file;
/**
* @var \DateTime
*
* @ORM\Column(name="dateAdded", type="datetime")
*/
private $dateAdded;
/**
* @var integer
*
* @ORM\Column(name="sort", type="integer")
*/
private $sort;
}
在Page实体中,您将变量'images'声明为构造函数中的ArrayCollection类型(用作基本数组的包装的Doctrine类)。在获取数据时,Doctrine将根据您的映射来确定将哪些图像推送到图像集合中。
/**
* Page
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Site\CoreBundle\Entity\PageRepository")
*/
class Page
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="page_title", type="string", length=255)
*/
private $pageTitle;
/**
* @var string
*
* @Gedmo\Slug(fields={"pageTitle"})
* @ORM\Column(name="slug", type="string", length=255)
*/
private $slug;
/**
* @ORM\OneToMany(targetEntity="PageImage", mappedBy="page")
*/
private $images;
public function __construct()
{
$this->products = new ArrayCollection();
}
}