У меня есть следующие 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, используя его интерфейсные модели, представления и формы?
Я попробовал это сейчас, и это сработало для меня. То есть, 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>