2015-03-19 5 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, я хочу для отображения атрибутов (это будут значения по умолчанию) этого конкретного лица, где идентификатор человека совпадает с идентификатором 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, 
    ]); 
} 

Теперь я вижу, что ваше отношение в Person модели называется getId0, вы можете для изменения читаемости, что getAttribs(), и перейти к ->with('attribs'), но это только экскурс :)

EDIT:, как @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

+0

Спасибо. Я обновлю свой ответ –

Смежные вопросы