0

2 つの主キーiddate. レコードを更新するのではなく、更新された情報を含む新しいレコードを挿入します。この新しいレコードも同じidで、dateフィールドは NOW() です。製品表を使用して質問を説明します。

特定の日付で製品の詳細を要求できるようにしたい。したがって、DQL で次のサブクエリを使用すると、問題なく動作します。

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

この製品テーブルには、カテゴリなどの参照テーブルがいくつかあります。このカテゴリ テーブルには、同じ主キーの組み合わせがidあります。date特定の日時に商品詳細とカテゴリー詳細をリクエストできるようにしたいです。したがって、上記のように 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)これを aまたは何らかのメソッドに追加することを考えましたが、setUp($date)ここで立ち往生しています。また、に追加すると役立ち@IdますEntity\Product::dateか?

誰かが私を助けてくれることを願っています。私は完全な解決策を期待していません。良い方向への一歩は非常に高く評価されます。

4

1 に答える 1

0

私は自分の解決策を見つけたと思います。トリックは (最初に、Doctrine 2.2 に更新することと)フィルターを使用することでした:

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);
于 2012-07-30T14:26:05.487 に答える