我需要使用yii-framework创建CRUD屏幕。使用一张桌子的简单CRUD屏幕工作得很好。我在使用下拉列表(链接表)时遇到问题/问题。
我已经安装了giix扩展,如果指定了FK,我想用下拉列表创建CRUD但是我的托管服务提供商上没有MySql Engine InnoDB,所以我无法使用该扩展。我需要手动完成。
我有两张桌子
主要: - ID STORE_ID 前缀
存储: - ID 名称
现在main的store_id是FK到商店表的id。我想为主表创建CRUD。
这样添加屏幕应显示: -
商店名称: - 下拉列表 前缀: - 文本框
查看屏幕应使用商店表的名称列,而不是显示store_id
感谢您的期待。
答案 0 :(得分:2)
使用Gii生成CRUD,然后阅读我的博客。 http://jmmurphy.blogspot.com/2013/05/using-yii-model-relations.html
基本上,在Gii Generation
之后,你的store_id字段会有这样的东西<?php echo $form->labelEx($model,'store_id'); ?>
<?php echo $form->textField($model, 'store_id', array('size'=>60,'maxlength'=>255));?>
<?php echo $form->error($model,'store_id'); ?>
textField行替换为:
<?php $list = CHtml::listData(Store::model()->findAll(), 'id', 'name'); ?>
<?php echo $form->dropDownList($model, 'store_id', $list, array('empty'=>'(Select a Store)')); ?>
您还需要在Main模型中定义关系,以便您可以访问相关表(即使您的数据库不支持外键),如下所示:
public function relations()
{
return array(
'store'=>array(self::BELONGS_TO, 'Store', 'store_id'),
);
}
要完成此关系,您还应该为Store模型添加以下关系:
public function relations()
{
return array(
'main'=>array(self::HAS_MANY, 'Main', 'store_id'),
);
}
这些关系定义了Store和Main之间的一对多关系,其中store是父级,Main是Child。要使其成为一对一关系,请将HAS_MANY更改为HAS_ONE。 HAS_ *进入父模型并指向子表中的外键属性。 BELONGS_TO进入子进程并告诉子表中的属性指向父进程中的主键。
现在要查看视图操作中的商店名称,您需要将view.php中的“store_id”更改为如下所示的数组:
array(
'name' => 'store_id',
'value' => $model->store->name,
)
管理员视图略有不同。我不确定为什么,但要在管理视图中查看商店名称而不是ID,您将需要使用如下所示的数组:
array(
'name' => 'store_id',
'value' => '$data->store->name',
)
请注意,Gii生成这个以便$ data是模型而不是$ model,并且它还有一个时髦的双间接内容,因此您需要将变量声明放在单引号中。
答案 1 :(得分:0)
感谢jmarkmurphy的帮助。你帮助了我很多,只有在你给我指导的时候,我才将你的答案标记为正确。只需详细发布确切的代码。
我用以下代码更改了view.php: -
<?php $this->widget('zii.widgets.CDetailView', array(
'data'=>$model,
'attributes'=>array(
'id',
'store.name',
'prefix',
),
));
还使用以下代码更改了admin.php: -
<?php echo CHtml::encode($data->store->name); ?>
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'main-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'id',
'store.name',
'prefix',
array(
'class'=>'CButtonColumn',
),
),
)); ?&GT;
再次感谢jmarkmurphy。非常感谢 。我的应用程序现在正在按照我想要的方式工作。