2016-06-28 58 views
0

我是Yii2的新手。我有三个表项目,设施和结表project_amenity,这里是代码:无法在Yii的交界表中插入记录

项目型号:

<?php 
namespace app\models; 
use yii\db\ActiveRecord; 

class Project extends \yii\db\ActiveRecord 
{ 
    public function getAmenities() 
    { 
     return $this->hasMany(Amenity::className(), ['id' => 'amenity_id'])->viaTable('project_amenity', ['project_id' => 'id']); 
    } 

    public function rules() 
    { 
     return [ 
      [['name', 'city'], 'required'], 
     ]; 
    } 
} 

美化型号:

<?php 
namespace app\models; 
use yii\db\ActiveRecord; 

class Amenity extends \yii\db\ActiveRecord 
{ 
    public function getProjects() 
    { 
     return $this->hasMany(Project::className(), ['id' => 'project_id'])->viaTable('project_amenity', ['amenity_id' => 'id']); 
    } 
} 

ProjectController

<?php 

namespace app\controllers; 

use Yii; 
use yii\filters\AccessControl; 
use yii\web\Controller; 
use app\models\Project; 
use app\models\Amenity; 
use yii\helpers\ArrayHelper; 
class ProjectController extends Controller 
{ 
    public function actionCreate() 
    { 
     $project = new Project; 
     $amenities = ArrayHelper::map(Amenity::find()->all(), 'id', 'name'); 

     if ($project->load(Yii::$app->request->post()) && $project->save()) { 
      return $this->render(['confirm', 'id' => $project->id]); 
     } else { 
      return $this->render('create', [ 
       'project' => $project, 'amenities' => $amenities 
      ]); 
     } 
    } 
} 

这里是不完整的创建观点:

<?php 
use yii\helpers\Html; 
use yii\widgets\LinkPager; 
use yii\widgets\ActiveForm; 

?> 
<?php $form = ActiveForm::begin(); ?> 
    <table class="table"> 
     <tr> 
      <td><?= $form->field($project, 'name'); ?></td> 
     </tr> 
     <tr> 
      <td ><?= $form->field($project, 'city'); ?></td> 
     </tr> 
     <tr> 
      <td><?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?></td> 
     </tr> 
    </table> 

<?php ActiveForm::end(); ?> 

ProjectAmenity个路口的模式

<?php 
namespace app\models; 
use yii\db\ActiveRecord; 

class ProjectAmenity extends \yii\db\ActiveRecord 
{ 
    public static function tableName() 
    { 
     return 'project_amenity'; 
    } 
    public function rules() 
    { 
     return [ 
      [['project_id', 'amenity_id'], 'required'] 
     ]; 
    } 
} 
?> 

我'能够显示相关数据,但无法插入。请建议如何在创建视图上显示欢迎复选框,以及如何在创建视图中显示插入中的数据项目project_amenity表。

回答

0

添加设施属性的项目模型:

public $amenities; 

添加checkboxlist到您的视图:

<?= $form->field($project, 'amenities')->checkboxList($amenities) ?> 

创建路口的模式如果不是已经存在。

环路通过输入在创建操作后保存:

if ($project->load(Yii::$app->request->post()) && $project->save()) { 
    // checkboxlist fills amenities property with corresponding keys 
    foreach($project->amenities as $amenity_key) { 
     $project_amenity = new ProjectAmenity([ 
      'project_id' => $project->id, 
      'amenity_id' => $amenity_key 
     ]); 
     $project_amenity->save(); 
    } 
} 
+0

感谢您的答复。我遵循你的指令,但错误“为foreach()提供的无效参数”。请参阅上面更新的联结型号代码。 – Alex

+0

在为设施属性定义规则后感谢它的工作。 – Alex

0
<?= $form->field($project, 'amenities')->inline()->checkBoxList( 
     ArrayHelper::map(Amenity ::find()->all(), 'name', 'name'), 
     ['style'=>'width:500px'] 
     ) 
     ?>