2012-10-12 58 views
1

Yii有四个模型。汽车,RaceCar,LuxuryCar和司机。验证Yii相关模型的属性

赛车HAS_ONE驱动

LuxuryCar HAS_ONE驱动

两个赛车和LuxuryCar来自同一个模型继承 - 汽车 - 使用相同的表继承。

LuxuryCar和RaceCar中都有一个“fuel_level”属性,用于更改驱动程序中的验证规则(如果RaceCar.fuel_level为零,驱动程序不应该将属性“操作”设置为“驾驶”)。

而不是必须添加每个可能的“属于”关系的驱动程序(我可能会添加更多的继承车型),然后检查,看看目前属于哪种汽车司机,所以我可以加载模型再次从数据库中,我想能够验证父级(例如RaceCar)中的Driver属性的值。

这可能吗?如果是这样,怎么样?如果不是,有没有更好的方法,我错过了?

+0

看样子有人编辑了,将有问题的位向大家解释 - 谢谢你。 – Hippyjim

回答

6

一个解决办法是简单地添加自定义(如在线)验证规则的driver属性你的车:

public function rules() { 
    return array('driver', 'validateDriver'); 
} 

public function validateDriver() { 
    if (!$this->driver->isFoo) { 
     $this->addError('driver', Yii::t('validation', '{attribute} is not foo!')); 
    } 
} 
+0

Thbanks - 虽然没有真正帮助 - 我需要从孩子访问父模型的属性,以决定如何验证。 – Hippyjim

+0

@Hippyjim:为什么?在我看来(虽然没有太多的信息),它不仅在技术上可行,而且更适合汽车验证其驾驶员。 – Jon

+1

对不起乔恩,我完全误解了你给我展示的东西 - 试了一下 - 这正是我所需要的 - 我认为你把驾驶员视为属性 - 当它是一个模型。我从来没有想到,您可以通过这种方式为子模型触发验证规则 - 该解决方案非常完美。谢谢! – Hippyjim

0

如果我明白你的问题正确,你想要这个

在你Driver添加到模型的关系作为

'car' => array(self::BELONGS_TO, 'Car', 'car_id'), 

,并检查哪种类型的Car属于Driver使用instanceOf运营商。例如

if($model->car insatnceOf RaceCar) 
    echo 'Its a racecar'; 
elseif($model->car instanceOf LuxuryCar) 
    echo 'Its a luxury car'; 
+0

这不会工作,因为汽车的实例将永远是一辆汽车,关系的第二个参数是要使用的模型类。 – Luke

+1

@Luke it ** will ** work。我现在测试它。我用http://www.yiiframework.com/wiki/198/single-table-inheritance/。你是否重载了'instantiate()'方法? – dInGd0nG

+0

对不起,你说得对。感谢您的链接。 – Luke