学说 - 从其他表中选择全部

时间:2014-01-27 05:24:47

标签: symfony doctrine-orm

我正在尝试基本上运行类似子查询的东西,以根据基本连接条件自动水合实体集合。 我不完全确定只有学说注释才有可能,但我还是想问。

所以我有一个名为“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;

}

2 个答案:

答案 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();
    }

}