命名空间表上的Doctrine关系

时间:2011-12-02 16:46:23

标签: database namespaces doctrine relationships

我有几个与其他模型有关系的学说模型。我们称之为ItemsOneItemsTwoItemsThree。每个都有一个定义为Products学说类(产品表)的关系,关系定义为:

$this->hasMany(
    'Models_Products as Products',
    array(
     'local'   => 'id',
     'foreign' => 'product_id',
    )
);

没有什么不寻常的。

我还有另一个存储命名空间数据的表(prices)。我的意思是,特定的表存储基于预定义密钥的数据(即VinylCDDVD),因此行将显示如下内容:

media_namespace  entity_id  quantity    unit_price
CD               4          1000        0.99
DVD              4          2500        1.25
CD               7          3750        0.25
Vinyl            15         75          4.25

entity_id是访问此表的每个模型的ID。因此,例如CD/entity_id = 4引用ItemsOne模型,DVD/entity_id = 4引用ItemsTwo模型等。

我想创建一种关系 - 我不知道是否可以这样做 - 而它将在模型中命名。所以在上面的产品关系剪辑中,我需要类似的东西(对于ItemsOne模型):

$this->hasMany(
    'Models_Prices as Prices',
    array(
     'local'   => 'id',
     'foreign' => 'entity_id',
    )
);

但是,上述内容将返回entity_id匹配ItemsOne表的所有价格,这部分是正确的。在上面的示例{@ 1}}中,它会返回entity_id = 4记录,但也会返回CD不是我需要的记录。我希望它基于DVD表过滤数据。简而言之,我需要的是:

media_namespace

上述内容能否反映在Doctrine的prices.media_namespace = 'CD' AND prices.entity_id = itemsone.id 关系中?我已经搜索过,但不能提供有用的东西。

任何指针都非常受欢迎!

1 个答案:

答案 0 :(得分:4)

您需要使用Doctrine子类。为每个命名空间创建一个子类。这将允许您按类名引用一组特定的数据。

  • class Models_Price
    • 子类Models_Price_CD
    • 子类Models_Price_DVD
    • 子类Models_Price_Vinyl

在Price类中,您需要指定以下内容:

public function setUp()
{
    parent::setUp();

    $this->setSubclasses(
        array(
            'Price_CD' => array(
                'media_namespace' => 'CD',
            ),
            'Price_DVD' => array(
                'media_namespace' => 'DVD',
            ),
            'Price_Vinyl' => array(
                'media_namespace' => 'Vinyl',
            ),
        )
    );
}

让我们假设ItemsOne使用名称空间CD,ItemsTwo使用名称空间DVD,而ItemsThree使用名称空间Vinyl。

对于这种情况,您可以为每个类添加以下关系:

ItemsOne:

$this->hasMany(
    'Models_Price_CD as Prices',
    array(
     'local'   => 'id',
     'foreign' => 'entity_id',
    )
);

ItemsTwo:

$this->hasMany(
    'Models_Price_DVD as Prices',
    array(
     'local'   => 'id',
     'foreign' => 'entity_id',
    )
);

ItemsThree:

$this->hasMany(
    'Models_Price_Vinyl as Prices',
    array(
     'local'   => 'id',
     'foreign' => 'entity_id',
    )
);

现在,每个价格关系将仅返回您的预期。看到子类的Doctrine会自动命名你在该表上执行的所有查询。