2015-02-10 2 views
3

У меня есть сложный объект, глядя похожи, как это:Yii2: Post сложные модели

class Article extends \yii\db\ActiveRecord { 
    public $id; 
    public $name; 

    /** @var ArticleAspectValue[] */ 
    public $aspects; 

    public function getArticleAspectValues() { 
     return $this->hasMany(ArticleAspectValue::className(), ['article_id' => $this->id]); 
    } 
} 

И у меня есть объект, служащий в качестве части более сложного объекта выше.

class ArticleAspectValue extends \yii\db\ActiveRecord { 
    public $aspect_id; // <--- Two-attributes identifier (two-col PK in db) 
    public $article_id; // <----' 
    public $value; 
} 

Хотя каждый ArticleAspectValue присваивается ArticleAspect и статьи, а также, одна статья имеет только свои собственные ArticleAspectValues.

Статья модели состоит из идентификатора, имени и массива сущностей, называемых ArticleAspectValues.

Я решил создать поля ввода для каждого ArticleAspectValue, но так как это простой для каждого на интерфейсе без подключения к модели позади.

Вопрос: Как выглядит форма и метод приемного контроллера для публикации новых значений на субителях, но в соответствии с их превосходной моделью, статья?

ПСdoc on complex models является TBD

+1

Не относится к вашему вопросу, но не делают этого 'class ArticleAspectValue extends \ yii \ db \ ActiveRecord {public $ aspect_id; public $ article_id; 'если вы это сделаете, вы фактически не будете считывать значения из базы данных. Если эти столбцы просто не объявляют их в tll. То же самое касается статьи –

+0

Это всего лишь пример кода. В RL я использую аннотированные свойства и магические геттеры. – Domi

ответ

1

Решение состоит в том, чтобы сохранить нижнюю модель в методе контроллера, а также выше, если они являются ActiveRecords, а также.

В соответствии с уважаемым комментарием от Михая П., я исправляю исправленный примерный код сверху и решение.

Основная модель сложной структуры выглядит следующим образом:

/** 
* The superior class in a complex model. 
* @property int $id 
* @property string $name 
* 
* @property ArticleAspectValues $aspects 
*/ 
class Article extends \yii\db\ActiveRecord 
{ 
    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getArticleAspectValues() { 
     return $this->hasMany(ArticleAspectValue::className(), ['article_id' => 'id']); 
    } 
} 

В Yii свойство ActiveRecord создается из таблицы базы данных столбцов. Yii предоставляет магические геттеры для получения своих ценностей. Чтобы работать со свойствами, которые на самом деле не существуют, вы можете их аннотировать в классе. Большинство IDE анализируют эти аннотации и предоставляют их как обычные элементы класса. То же самое работает для методов.

Нижайшая класс комплексной модели выглядит следующим образом:

/** 
* The inferior class of the complex model. 
* @property int $aspect_id 
* @property int $article_id 
* @property string $value 
*/ 
class ArticleAspectValue extends \yii\db\ActiveRecord 
{ 
    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getArticle() { 
     return $this->hasOne(Article::className(), ['article_id' => 'id]); 
    } 
} 

В контроллере вышестоящей модели, подчиненные сохраняется в то же время.

class ArticleController extends \yii\db\ActiveRecord 
{ 
    // ... 

    // Exemplary method. Goes for create action as well. 
    public function actionUpdate($id) { 
     $model = $this->findModel($id); 

     if ($model->load(Yii::$app->request->post()) && $model->save()) { 
      if ($model->aspects->load(Yii::$app->request->post()) && $model->aspects->save()) { 
       return $this->redirect(['view', 'id' => $model->id]); 
      } 
    } 
} 

Метод загрузки ActiveRecords способен анализировать тело целой почты, чтобы получить свои собственные значения.

Возможно, лучше расширить нагрузку и сохранить методы вашей сложной модели для обработки нижестоящих элементов, а не инструктировать контроллер для каждой уступающей модели.

+0

Это не будет работать, если '$ model-> aspect' является массивом, например, в отношениях« один ко многим ». – topher

+0

Это правильно и еще одна причина перегрузить методы load() и save() в вашей модели для обработки массивов. – Domi

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