Yii2, расширяющий Gii CRUD с элементами множества-ко-многим

У меня есть следующие 3 таблицы:

Rule -id -name CombinedRule -id -name RuleCombineMapping -id_rule -id_combine 

Я создал CRUD для правила и для таблицы CombinedRule. В классе модели 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']); } } 

Без успеха я попытался получить доступ к правилам определенного CombinedRule, используя следующие строки внутри CombinedRuleController .

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

Результатом всегда является исключение «Неизвестное свойство».

Теперь я хочу просмотреть / обновить / прочитать / удалить не только правила и CombinedRules, но и связь между этими двумя.

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

Теперь у кого-нибудь есть рабочий пример, как сопоставить эти таблицы с использованием аналогичной установленной структуры данных, а также интегрировать его как можно проще в Gii CRUD, используя его интерфейсные модели, представления и формы?

Solutions Collecting From Web of "Yii2, расширяющий Gii CRUD с элементами множества-ко-многим"

Я попробовал это сейчас, и это сработало для меня. То есть, var_dump($model->rules); в файле вида дал мне массив с объектами Rule, как и ожидалось.

Вот мои созданные gii файлы. Я удалил комментарии, методы attributeLabels (), rules () из классов моделей, а также методы действий и поведения () из класса контроллера. Таким образом, это важный код, необходимый для выполнения правил $ model->:

правило

 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>