sharehua
(8080268)
March 6, 2009, 2:31am
1
在JAVA的hibernate中,父类和子类使用同一个table,table中使用一个字段来区分各类。用户在操作过程中不感觉到父类和子类共用同一个table。整个操作过程中hibernate会自动匹配相关数据,很有面向对象感觉。不知道Yii有类似的功能吗?
java的代码如下:
@Entity
@Table (name = "_core_type")
@DiscriminatorColumn (name = "subclass", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue ("Type")
public class Type {
@Id
@GeneratedValue
private Long id;
}
//----子类----------------------
@Entity
@DiscriminatorValue ("TypeMessage")
public class TypeMessage extends Type{
public TypeMessage(){
}
}
qiang
(Qiang Xue)
March 6, 2009, 2:36am
2
Yii里没有直接提供这个支持,因为table的继承有好几种方法,这个只是其中一种(也是被RoR采用的)。实现这种继承方法很简单,你只要override CActiveRecord::instantiate()就可以了。在这个函数里,你可以根据特定的字段来创建相应的AR实例。
sharehua
(8080268)
March 7, 2009, 5:51am
3
谢谢qiang。但还有些不明白。
父类:Type 子类:TypeAnnual 和 TypeArea 他们同用一个table。数据区别在于subclass的标示不一样。
父类override了instantiate
protected function instantiate($attributes){
if($attributes['subclass']==('TypeAnnual')){
return new TypeAnnual(null);
}else if($attributes['subclass']==('TypeArea')){
return new TypeArea(null);
}else{
return new $class(null);
}
}
但TypeAnnual::mode->findAll()和TypeArea::mode->findAll()在哪里设定返回各自的数据。也就是想问TypeAnnual的CRUD怎样保证是操作自己的数据。特别是R操作中,自动匹配自己的数据。
qiang
(Qiang Xue)
March 7, 2009, 1:00pm
4
你是指TypeAnnual的findAll()希望返回的仅仅是TypeAnnual的数据,不要有TypeArea?
这的确是个问题,尽管通过设置查询条件可以解决。
你创建一个ticket吧,我看看能否提供更好的支持。