2015-03-19 90 views
1

我試圖從兩個相關的模型中獲取信息,顯示在一個視圖中。在Yii2中顯示相同視圖的兩個模型

因此,我試圖完成的是有索引視圖來顯示人員列表,如果我然後詳細查看該特定人員,我想要一個與該人員相關的屬性列表出現。

我有數據庫設置,所以當我創建一個新人時,一個默認行被插入屬性表中,該人員的名字叫person_id。

見我的兩個模型類

人:

class People extends \yii\db\ActiveRecord 
{ 
    /** 
    * @inheritdoc 
    */ 
    public static function tableName() 
    { 
     return 'people'; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function rules() 
    { 
     return [ 
      [['dob', 'CURDATE'], 'safe'], 
      [['age'], 'integer'], 
      [['firstname', 'surname'], 'string', 'max' => 50] 
     ]; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function attributeLabels() 
    { 
     return [ 
      'id' => 'ID', 
      'firstname' => 'Firstname', 
      'surname' => 'Surname', 
      'dob' => 'Dob', 
      'age' => 'Age', 
      'CURDATE' => 'Curdate', 
     ]; 
    } 

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getId0() 
    { 
     return $this->hasOne(Attributes::className(), ['person_id' => 'id']); 
    } 
} 

屬性:

class Attributes extends \yii\db\ActiveRecord 
{ 
    /** 
    * @inheritdoc 
    */ 
    public static function tableName() 
    { 
     return 'attributes'; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function rules() 
    { 
     return [ 
      [['haircolor', 'eyecolor', 'weight', 'height', 'person_id'], 'required'], 
      [['weight', 'height', 'person_id'], 'integer'], 
      [['haircolor', 'eyecolor'], 'string', 'max' => 50] 
     ]; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function attributeLabels() 
    { 
     return [ 
      'id' => 'ID', 
      'haircolor' => 'Haircolor', 
      'eyecolor' => 'Eyecolor', 
      'weight' => 'Weight', 
      'height' => 'Height', 
      'person_id' => 'Person ID', 
     ]; 
    } 

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getPeople() 
    { 
     return $this->hasOne(People::className(), ['id' => 'person_id']); 
    } 
} 

我已經爲這兩個模型的生成CRUD通過GII。

我想知道的是如何設置我的人員控制器和人員查看,以便這可以正常工作。

回想一下,我的index.php視圖將只顯示人員列表,如果存在記錄,您可以查看該特定記錄,如果您查看記錄 - 這將是view.php文件,我想以顯示該特定人的屬性(這些將是默認值),其中該人的ID與屬性表中的person_id相同

然後用戶將能夠更新與該人有關的屬性。

親切的問候。

回答

0

下面的例子:

public function actionCreate() 
{ 
    $user = new User; 
    $profile = new Profile; 

    if ($user->load(Yii::$app->request->post()) && $profile->load(Yii::$app->request->post()) && Model::validateMultiple([$user, $profile])) { 

     $user->save(false); // skip validation as model is already validated 
     $profile->user_id = $user->id; // no need for validation rule on user_id as you set it yourself 
     $profile-save(false); 

     return $this->redirect(['view', 'id' => $user->id]); 
    } else { 
     return $this->render('create', [ 
      'user' => $user, 
      'profile' => $profile, 
     ]); 
    } 
} 

更多信息:

http://www.yiiframework.com/forum/index.php/topic/53935-solved-subforms/page__p__248184

http://www.yiiframework.com/doc-2.0/guide-input-tabular-input.html

0

要在視圖中顯示的相關信息,你得到預先加載的最佳性能。我會提供一個例子:

public function actionView($id) 
{ 
    $model = Person::find() 
     ->where(['id' => $id]) 
     ->with('id0') 
     ->one(); 

    return $this->render('view', [ 
      'model' => $model, 
    ]); 
} 

現在我明白了,你在角色模型關係稱爲getId0,你可以爲可讀性的變化,要getAttribs(),並更改爲->with('attribs')但是,這只是題外話:)

編輯:爲@soju評論,屬性是不可能的,因爲關係名稱來使用,這就是爲什麼GII給了它的名字getId0。屬性或更多信息可能會有助於提高可讀性。

如果你想顯示在插件的結果,如GridView控件或ListView,你可以在這裏遵循的指導:

http://www.ramirezcobos.com/2014/04/16/displaying-sorting-and-filtering-model-relations-on-a-gridview-yii2/

EDIT2:爲@soju評論,指南是可能過時。請閱讀官方文件。 http://www.yiiframework.com/doc-2.0/guide-output-data-widgets.html#working-with-model-relations

如果你想創建自己的觀點,你可以用$model->id0->haircolor訪問值,或者,如果重命名的關係,$model->attribs->haircolor就像你會任何其他屬性。

記住:使用的GridView/ListView控件從數據庫顯示的時候,像'attributes.eyecolor',但$model->id0需要從模型中關係的名字,而在前面的「得到」,以更低的情況下,需要表名。

+0

使用'屬性'作爲關係名是不可能的,並且鏈接教程已過時,官方文檔更好http://www.yiiframework.com/doc-2.0/guide-output-data-widgets.html#working -with-model-relations – soju 2015-03-19 14:31:24

+0

謝謝。我會更新我的答案 – 2015-03-19 14:33:38

相關問題