0

私は3つのテーブルを持っています:外部キー付きモデルのYii 2.0ビュー

最初のテーブルはメインテーブルTheSims4Pagesです。それにはidという名前の主キーがあります。 2番目の表は、関連テーブル

CREATE TABLE IF NOT EXISTS `TheSims4PagesCategoriesRelations` (
    `id` int(11) NOT NULL, 
    `postId` int(11) NOT NULL, 
    `catId` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ALTER TABLE `TheSims4PagesCategoriesRelations` 
    ADD CONSTRAINT `TheSims4PagesCategoriesRelations_ibfk_2` FOREIGN KEY (`catId`) REFERENCES `TheSims4PagesCategories` (`id`), 
    ADD CONSTRAINT `TheSims4PagesCategoriesRelations_ibfk_1` FOREIGN KEY (`postId`) REFERENCES `TheSims4Pages` (`id`); 

され、第3表は、PK idと、TheSims4PagesCategoriesあります。

現在、私は、モデルTheSims4Pagesを持っている:

<?php 

namespace app\models\TheSims4; 

use Yii; 

/** 
* This is the model class for table "TheSims4Pages". 
* 
* @property integer $id 
* @property string $pageName 
* @property string $pageEditDate 
* @property integer $isDraft 
* @property integer $authorId 
* @property string $pageText 
* 
* @property SiteUsers $author 
* @property TheSims4PagesCategoriesRelations[] $theSims4PagesCategoriesRelations 
*/ 
class TheSims4Pages extends \yii\db\ActiveRecord { 

    /** 
    * @inheritdoc 
    */ 
    public static function tableName() { 
     return 'TheSims4Pages'; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function rules() { 
     return [ 
      [['pageName', 'authorId', 'pageText'], 'required'], 
      [['pageEditDate'], 'safe'], 
      [['isDraft', 'authorId'], 'integer'], 
      [['pageText'], 'string'], 
      [['pageName'], 'string', 'max' => 500], 
      [['authorId'], 'exist', 'skipOnError' => true, 'targetClass' => SiteUsers::className(), 'targetAttribute' => ['authorId' => 'id']], 
     ]; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function attributeLabels() { 
     return [ 
      'id' => 'ID', 
      'pageName' => 'Page Name', 
      'pageEditDate' => 'Page Edit Date', 
      'isDraft' => 'Is Draft', 
      'authorId' => 'Author ID', 
      'pageText' => 'Page Text', 
     ]; 
    } 

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

    /** 
    * @return \yii\db\ActiveQuery 
    */ 
    public function getTheSims4PagesCategoriesRelations() { 
     return $this->hasMany(TheSims4PagesCategoriesRelations::className(), ['postId' => 'id']); 
    } 

} 

モデルのgetTheSims4PagesCategoriesRelations

echo $form->field($model, 'categoryId')->dropDownList($listData); 

のようなもののためではなく、関係テーブルのselect要素で、TheSims4Pagesのためのビューを作成する方法は?

Ieが、私はTheSims4PagesCategoriesテーブルからすべてのカテゴリを選択する項目を作成し、モデル

$model = new TheSims4Pages(); 

へのカテゴリの複数選択を保存するには、どうもありがとうございました!ビューで

答えて

1

:(「カテゴリ名は」ラベルとして使用されているカテゴリテーブルから列です)

<?= $form->field($model, 'categories') 
    ->dropDownList(ArrayHelper::map(TheSims4PagesCategories::find()->all(), 
     'id', 
     'categoryName' 
    ), ['multiple'=>'multiple']) ?> 

モデルでは、仮想変数を追加

// ... 

class TheSims4Pages extends \yii\db\ActiveRecord { 

    public $categories; 

    public function rules() 
    { 
     return [ 
      ['categories', 'each', 'rule' => ['integer']], 
      // your other rules 
     ]; 
    } 

    // ... 


    public function afterFind() 
    { 
     parent::afterFind(); 

     $this->categories = []; 

     if (!empty($this->theSims4PagesCategoriesRelations)) { 
      foreach ($this->theSims4PagesCategoriesRelations as $cat) { 
       $categories[$cat->catId] = $cat->catId; 
      } 
      $this->categories = $categories; 
     } 
    } 

    /* deleting might work better in afterSave 
     due to ending up with posts without categories on constraint fail 
    public function beforeSave($insert) 
    { 
     parent::beforeSave($insert); 

     if ($insert) { 
     } else { 
      TheSims4PagesCategoriesRelations::deleteAll(['postId' => $this->id]); 
     } 
    } 
    */ 

    public function afterSave($insert, $changedAttributes) 
    { 
     parent::afterSave($insert, $changedAttributes); 

     if ($insert) { 
     } else { 
      TheSims4PagesCategoriesRelations::deleteAll(['postId' => $this->id]); 
     } 

     if ($this->categories) { 
      foreach ($this->categories as $cat_id) { 
       $relation = new TheSims4PagesCategoriesRelations(); 
       $relation->postId = $this->id; 
       $relation->catId = $cat_id; 
       $relation->save(); 
      } 
     } 
    } 
} 
+0

これは、DBの整合性の問題、それを最善を解決しませんすることができますが、それは仕事をするでしょう、そうでなければ、あなたはトランザクションを使用したいかもしれません – Ripper

+0

こんにちは!どうもありがとうございました!しかし、私のテーブルにFKがある場合、なぜそんなに複雑なのですか?例えば、多くのフィールド値のためのthymeleaf.org Javaテンプレートエンジンでは、 '

'(http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html#checkbox-fields)のようなものを書くことができます。 lsyメソッドを使用して、Sims4PagesCategoriesRelationsにアクセスします。 Yii 2.0のための同様の方法はありますか? –

+0

まあ、これはYiiで動作する方法です、リレーションは属性のように読み込まれません。 – Ripper

関連する問題