5

我有一个纯粹用于计算目的的实体(发票),没有表,它与其他两个具有表关系的实体相关联。(尽管涉及的其他实体很多)。

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 中)与查询相关联?

稍后此发票将成为另一个用于计算/搜索目的的大实体的一部分。

谢谢

4

2 回答 2

7

简短的回答:你不能

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

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

更新

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

于 2013-07-04T15:18:15.617 回答
-1

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

PHP:

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

SQL:

CREATE VIEW invoice_view AS (
    SELECT ... 
于 2018-02-22T07:52:48.417 回答