2012-10-12 175 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