我有几个与其他模型有关系的学说模型。我们称之为ItemsOne
,ItemsTwo
,ItemsThree
。每个都有一个定义为Products
学说类(产品表)的关系,关系定义为:
$this->hasMany(
'Models_Products as Products',
array(
'local' => 'id',
'foreign' => 'product_id',
)
);
没有什么不寻常的。
我还有另一个存储命名空间数据的表(prices
)。我的意思是,特定的表存储基于预定义密钥的数据(即Vinyl
,CD
,DVD
),因此行将显示如下内容:
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
关系中?我已经搜索过,但不能提供有用的东西。
任何指针都非常受欢迎!
答案 0 :(得分:4)
您需要使用Doctrine子类。为每个命名空间创建一个子类。这将允许您按类名引用一组特定的数据。
在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会自动命名你在该表上执行的所有查询。