Yii2使用多对多表单元素扩展Gii CRUD

时间:2015-06-01 17:04:48

标签: php many-to-many yii2

我有以下3个表格:

Rule
-id
-name

CombinedRule
-id
-name

RuleCombineMapping
-id_rule
-id_combine

我为Rule和CombinedRule表生成了一个CRUD。在CombinedRule模型类中,我创建了一个映射,该类如下所示:

<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "combinedrule".
 *
 * @property integer $id
 * @property string $name
 */
class CombinedRule extends \yii\db\ActiveRecord {

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

    /**
     * @inheritdoc
     */
    public function rules() {
        return [
            [['name'], 'string', 'max' => 255],
            [['name'], 'unique']
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels() {
        return [
            'id' => 'ID',
            'name' => 'Name',
        ];
    }

    public function getRules() {
        return $this->hasMany(Rule::className(), ['id' => 'id_rule'])
                        ->viaTable(RuleCombineMapping::tableName(), ['id_combine' => 'id']);
    }

}

如果没有成功,我尝试使用CombinedRuleController中的以下行来访问某个CombinedRule的规则。

$t = CombinedRule::find($id);
var_dump($t->rules);

结果始终是“未知属性”异常。

现在我想查看/更新/读取/删除规则和组合规则,以及这两者之间的关系。

我知道在使用doctrine的其他框架中这是可能的,我也知道如何手动首先获取关系,然后将其添加到列表中。

现在有没有人有一个工作示例如何使用类似的已建立的数据结构映射这些表,并使用其前端模型,视图和表单在Gii CRUD中尽可能简单地集成它?

1 个答案:

答案 0 :(得分:0)

我现在自己尝试过,它对我有用。也就是说,视图文件中的var_dump($model->rules);为我提供了一个具有预期的Rule对象的数组。

这是我的gii生成的文件。我从控制器类中删除了模型类中的注释,attributeLabels(),rules()方法以及操作方法和行为()。因此,这是使$ model-&gt;规则工作所需的基本代码:

<强>规则

class Rule extends \yii\db\ActiveRecord {
    public static function tableName() {
        return 'rule';
    }
}

<强> CombinedRule

class CombinedRule extends \yii\db\ActiveRecord {
    public static function tableName() {
        return 'combined_rule';
    }

    // Added this manually, this does not come from gii!
    // It is the single code that I've added.
    public function getRules() {
        return $this->hasMany(Rule::className(), ['id' => 'id_rule'])
            ->viaTable(RuleCombineMapping::tableName(), ['id_combine' => 'id']);
    }
}

<强> RuleCombineMapping

Gii还生成了两种getIdCombine()getIdRule()方法,这些方法对于该问题也不是必不可少的。

class RuleCombineMapping extends \yii\db\ActiveRecord {
    public static function tableName() {
        return 'rule_combine_mapping';
    }
}

<强> CombinedRuleController

class CombinedRuleController extends Controller {

    public function actionView($id) {
        return $this->render('view', [
            'model' => $this->findModel($id),
        ]);
    }

    protected function findModel($id) {
        if (($model = CombinedRule::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }
}

<强>视图/合并规则/ view.php

刚刚添加了var_dump($model->rules);。其他是gii生成的代码。

use yii\helpers\Html;
use yii\widgets\DetailView;

$this->title = $model->title;
$this->params['breadcrumbs'][] = ['label' => 'Combined Rules', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="combined-rule-view">

    <h1><?= Html::encode($this->title) ?></h1>

    <p>
        <?= Html::a('Update', ['update', 'id' => $model->id], ['class' => 'btn btn-primary']) ?>
        <?= Html::a('Delete', ['delete', 'id' => $model->id], [
            'class' => 'btn btn-danger',
            'data' => [
                'confirm' => 'Are you sure you want to delete this item?',
                'method' => 'post',
            ],
        ]) ?>
    </p>

    <?= DetailView::widget([
        'model' => $model,
        'attributes' => ['id', 'title'],
    ]) ?>

    <?php
        // And here it is: an array of Rule objects!!!!! 
        var_dump($model->rules);
    ?>
</div>