Yii2 使用多对多表单元素扩展 Gii CRUD
Yii2 extending Gii CRUD with many-to-many form elements
我有以下 3 tables:
Rule
-id
-name
CombinedRule
-id
-name
RuleCombineMapping
-id_rule
-id_combine
我为 Rule 和 CombinedRule table 生成了一个 CRUD。在 CombinedRule 模型 class 中,我创建了一个映射 class 如下所示:
<?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);
结果总是 'Unknown Property' 异常。
现在我不仅要 view/update/read/delete Rules 和 CombinedRules,还要了解这两者之间的关系。
我知道这在其他使用学说的框架中是可能的,我也知道如何手动执行此操作,首先获取关系,然后将其添加到列表中。
现在有没有人有一个工作示例如何使用类似的既定数据结构映射此 tables 并使用其前端模型、视图和表单将其尽可能简单地集成到 Gii CRUD 中?
我现在自己试过了,对我有用。也就是说,var_dump($model->rules);
在视图文件中按预期给了我一个包含 Rule 对象的数组。
这是我的 gii 生成的文件。我已经从模型 classes 中删除了评论、attributeLabels()、rules() 方法,并从控制器 class 中删除了操作方法和 behaviors()。所以这是使 $model->rules 工作所需的基本代码:
规则
class Rule extends \yii\db\ActiveRecord {
public static function tableName() {
return 'rule';
}
}
组合规则
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.');
}
}
}
views/combined-rule/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>
我有以下 3 tables:
Rule
-id
-name
CombinedRule
-id
-name
RuleCombineMapping
-id_rule
-id_combine
我为 Rule 和 CombinedRule table 生成了一个 CRUD。在 CombinedRule 模型 class 中,我创建了一个映射 class 如下所示:
<?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
.
$t = CombinedRule::find($id);
var_dump($t->rules);
结果总是 'Unknown Property' 异常。
现在我不仅要 view/update/read/delete Rules 和 CombinedRules,还要了解这两者之间的关系。
我知道这在其他使用学说的框架中是可能的,我也知道如何手动执行此操作,首先获取关系,然后将其添加到列表中。
现在有没有人有一个工作示例如何使用类似的既定数据结构映射此 tables 并使用其前端模型、视图和表单将其尽可能简单地集成到 Gii CRUD 中?
我现在自己试过了,对我有用。也就是说,var_dump($model->rules);
在视图文件中按预期给了我一个包含 Rule 对象的数组。
这是我的 gii 生成的文件。我已经从模型 classes 中删除了评论、attributeLabels()、rules() 方法,并从控制器 class 中删除了操作方法和 behaviors()。所以这是使 $model->rules 工作所需的基本代码:
规则
class Rule extends \yii\db\ActiveRecord {
public static function tableName() {
return 'rule';
}
}
组合规则
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.');
}
}
}
views/combined-rule/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>