【问题标题】:Entity containing other entities without having a table包含其他实体但没有表的实体
【发布时间】:2013-07-04 14:00:43
【问题描述】:

我有一个实体 ( Invoice ),它纯粹用于计算目的并且没有表,它与其他两个具有表关系的实体相关联。 (虽然涉及的其他实体很多)。

class Row{
    /**
     * @var integer
     *
     * @ORM\Column(name="row_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="File")
     * @ORM\JoinColumn(name="file_id", referencedColumnName="file_id")
     */
    protected $file;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date", type="date")
     */
    private $date;

}

class File
{
    /**
     * @var integer
     *
     * @ORM\Column(name="file_id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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


}


class Invoice
{
    /**
     * @ORM\Id
     * @ORM\Column(name="invoice_id", type="integer")
     * @ORM\GeneratedValue
     */
    protected $id = null;

    /**
     * @ORM\OneToMany(targetEntity="Row", mappedBy="row_id")
     */
    protected $row;

    /**
     * @ORM\OneToMany(targetEntity="File", mappedBy="file_id")
     */
    protected $file;

}

我希望能够查询发票:

$sDate = //Some date
$this->getEntityManager()
     ->createQuery("SELECT Invoice, Row, File
                        FROM
                            ReportsEntitiesBundle:Invoice Invoice
                        LEFT JOIN
                            Row.row Row
                        LEFT JOIN
                            Row.file File
                    WHERE date=:date"
                  )
 ->setParaMeter(':date', $sDate)
 ->setFirstResult($iPage*$iLimit)
 ->setMaxResults($iLimit)
 ->getResult();

问题: # Doctrine 尝试查询数据库,我怎样才能阻止它并让它找到相关实体? # 如何将日期(在 Row 实体中,不能在 Invoice 中)与查询相关联?

以后这张发票将成为另一个大实体的一部分,用于计算/搜索。

谢谢

【问题讨论】:

    标签: symfony orm doctrine-orm


    【解决方案1】:

    简短回答:你不能

    长答案:您不能,因为带有 @ORM 注释的实体意味着它持久化到数据库中 - 查询该实体与查询数据库表有关。为什么不直接创建表?!?!?

    您需要在某个地方保持filerow 之间的关联 - 数据库表是一个完美的地方!!!!

    更新

    只是为了澄清...实体只是一个标准类-它具有属性和方法...就像任何其他类一样-当您发出基于教义的命令时,它使用实体中的注释来配置表/列/ 关系等如果删除那些你可以使用它但是你喜欢......但你需要填充值来使用它,你将无法在 Doctrine 查询中使用它,它显然不会被持久化!

    【讨论】:

    • 感谢您的回答。我理解在 symfony2 中,业务逻辑位于实体中,这并不意味着它必须在数据库中有一个表,不是吗?...还有其他方法吗?
    • @Arsham 确实可以在不使用数据库的情况下拥有实体 - 但您如何期望它们被持久化?如果要保存实体之间的关系,则需要将该关系存储在数据库中
    • @MansueUK 信息已经通过 Row、File 和其他实体保存在数据库中,再次保存它们没有任何意义。现在可以在不使用数据库的情况下拥有实体,我如何访问它们?我可以在 entityRepository 中这样做吗?
    • @Arsham 实体只是一个标准类 - 它具有属性和方法......就像任何其他类一样 - 你可以随意使用它......但你需要填充值使用它 - 你将无法在 Doctrine 查询中使用它
    【解决方案2】:

    您可以使用只读实体。它的内容由您在 SQL 中手动创建的视图提供支持。

    PHP:

    /** @ORM\Entity(readOnly =true) */
    class InvoiceView 
    { ... 
    

    SQL:

    CREATE VIEW invoice_view AS (
        SELECT ... 
    

    【讨论】:

    猜你喜欢
    • 2023-02-23
    • 2014-12-02
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    相关资源
    最近更新 更多