2012-07-27 105 views
0

我有幾個數據庫表,其中有兩個主鍵iddate。我不更新記錄,而是插入帶有更新信息的新記錄。這個新記錄具有相同的iddate字段是NOW()。我將使用產品表來解釋我的問題。Doctrine 2編輯實體DQL

我希望能夠在特定日期請求產品詳細信息。因此,我在DQL中使用以下子查詢,該工作正常:

WHERE p.date = (
    SELECT MAX(pp.date) 
    FROM Entity\Product pp 
    WHERE pp.id = p.id 
    AND pp.date < :date 
) 

此產品表包含一些引用表,如類別。此類別表具有相同的iddate主鍵組合。我希望能夠在特定日期請求產品詳細信息和類別詳細信息。因此,我擴大了DQL如上圖所示爲以下,這也能正常工作:

JOIN p.category c 
WHERE p.date = (
    SELECT MAX(pp.date) 
    FROM Entity\Product pp 
    WHERE pp.id = p.id 
    AND pp.date < :date 
) 
AND c.date = (
    SELECT MAX(cc.date) 
    FROM Entity\ProductCategory cc 
    WHERE cc.id = c.id 
    AND cc.date < :date 
) 

然而,正如你所看到的,如果我有多個引用的表,我將不得不復制同一塊DQL的。我想以某種方式將這些子查詢添加到實體中,以便每次調用實體時都會添加此子查詢。

我曾想過在__construct($date)或某種setUp($date)方法中添加這個,但我有點卡在這裏。此外,它是否有助於將@Id添加到Entity\Product::date

我希望有人能幫助我。我並不期望有一個完整的解決方案,我們將非常感激朝着良好方向邁出的一步。

回答

0

我想我找到了我的解決方案。訣竅是(第一,更新教義2.2)使用filter

namespace Filter; 

use Doctrine\ORM\Mapping\ClassMetaData, 
    Doctrine\ORM\Query\Filter\SQLFilter; 

class VersionFilter extends SQLFilter { 
    public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias) { 
     $return = $targetTableAlias . '.date = (
      SELECT MAX(sub.date) 
      FROM ' . $targetEntity->table['name'] . ' sub 
      WHERE sub.id = ' . $targetTableAlias . '.id 
      AND sub.date < ' . $this->getParameter('date') . ' 
     )'; 

     return $return; 
    } 
} 

添加過濾器配置:

$configuration->addFilter("version", Filter\VersionFilter"); 

而且在我的倉庫啓用:

$this->_em->getFilters()->enable("version")->setParameter('date', $date);