2016-09-02 3 views
1

言語と専門分野を含むそのプロファイル内の複数のフィールドとプロファイルとの間に多対多の関係を作成しようとしています。私はいくつかの実装を見て、いくつかの拡張があることを理解していますが、拡張の使用を最小限にする必要があります。Yii2の多対多の関係

私は適切な移行を作成しました。これはスケルトンであり、ユーザーテーブルは純粋にログイン用とOAuth用です。したがって、キーは無視できます。あなたが私のコントローラーで見ることができるように、私はこの時点でどのように進むのか本当に分かりません。私の言語モデルは、このコントローラから静的なすべての集中的な目的(管理バックエンドによって制御されます)です。何が働いていますか?下のコードをいくつか変更すると、チェックボックスリストに、手動でルックアップテーブルに追加した適切なチェック項目が表示されます。コードからルックアップテーブルを変更しようとすると、$ languageModelにfindOne(knownPK)を設定しないとできませんでしたが、複数のチェックボックスを選択でき、linkコマンドにActiveRecordInterfaceこれは単数形です。理想的には、私は単純に使用したいです

 $languageModel->load(Yii::$app->request->post(),$trainerModel->formName()); 

しかし、それは動作しません。

さらに、フレームワーク内にルックアップを削除するメカニズムがあるのか​​、それとも手動で行われるのでしょうか。助けや洞察力があれば助けになります。前もって感謝します。

public function safeUp() 
{ 
    $this->createTable('student', [ 
     'id'     => $this->primaryKey(), 
     'user_id'   => $this->integer()->notNull(), 
    ]); 

    $this->createTable('language', [ 
     'id'     => $this->primaryKey(), 
     'language' => $this->string(63), 
    ]); 

    $this->createTable('student_language',[ 
     'id'     => $this->primaryKey(), 
     'language_id' => $this->integer(), 
     'student_id' => $this->integer() 
    ]); 

     $this->addForeignKey('fk-student-language-language', 'student_language', 'language_id', 'language', 'id', 'CASCADE', 'CASCADE'); 
     $this->addForeignKey('fk-student-language-student', 'student_language', 'student_id', 'student', 'id', 'CASCADE', 'CASCADE'); 
     $this->addForeignKey('fk-student-user-user_id', 'student', 'user_id', 'user', 'id', 'CASCADE', 'CASCADE'); 
    } 

私の学生のActive Record

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

public function getLanguages(){ 
    return $this->hasMany(Language::className(),['id'=>'language_id'])->viaTable('student_language',['student_id'=>'id']); 
} 

私の言語モデル

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

public function getLanguages(){ 
    return $this->hasMany(student::className(),['id'=>'student_id'])->viaTable('student_language',['language_id'=>'id']); 
} 

マイコントローラー

public function actionProfile() 
{ 
    if (Yii::$app->user->isGuest) { 
     throw new UnauthorizedHttpException('This page requires you to be logged in'); 
    } else { 
     $user_id = Yii::$app->user->identity->getId(); 
     $studentModel = $this->findstudentModelByUserId($user_id); 
     if (is_null($studentModel)) { 
      $studentModel = new student(); 
      $studentModel->setAttribute('user_id', $user_id); 
      $studentModel->save(); 
     } 

    $languageModel = ?????????????????? 


     $studentModel->load(Yii::$app->request->post()) && $studentModel->save() && $studentModel->link('languages',$languageModel); 

    } 

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

マイビュー

<?= $form->field($model, 'languages')->checkboxList(\common\models\Language::find()->select(
         ['language', 'id'])->indexBy('id')->column(),  ['prompt' => 'select Language']); ?> 

答えて

0

これは私の解決策ですが、改善が必要です。 注:エラーチェックなどはありません。機能コードのみです。

私は学生のActiveRecordクラスに

public function linkMultiple($name,Array $models){ 

    studentLanguage::deleteAll(['student_id' =>$this->id]); 

    foreach($models as $model){ 
     $this->link($name, $model); 
    } 
    return true; 
} 

これを追加次

public function actionProfile() 
{ 
    if (Yii::$app->user->isGuest) { 
     throw new UnauthorizedHttpException('This page requires you to be logged in'); 
    } else { 
     $user_id = Yii::$app->user->identity->getId(); 
     $studentModel = $this->findstudentModelByUserId($user_id); 
     if (is_null($studentModel)) { 
      $studentModel = new student(); 
      $studentModel->setAttribute('user_id', $user_id); 
      $studentModel->save(); 
     } 

     $languages = Yii::$app->request->post('student')['languages']; 
     $languageModels = Language::findAll($languages); 

     $studentModel->load(Yii::$app->request->post()) && $studentModel->save() && $studentModel->linkMultiple('languages',$languageModels); 

    } 

    return $this->render('profile', ['model' => $studentModel]); 
} 
に私のコントローラのアクションを変更