1

我需要使用 yii-framework 创建 CRUD 屏幕。使用一张表的简单 CRUD 屏幕运行良好。我在使用下拉列表(链接表)时遇到问题/问题。

我已经安装了 giix 扩展,如果指定了 FK,它假设使用下拉菜单创建 CRUD,但我的托管服务提供商上没有 MySql Engine InnoDB,所以我无法使用该扩展。我需要手动完成。

我有两张桌子

main:- id store_id 前缀

商店:- id 名称

现在 main 的 store_id 是存储表的 id 的 FK。我想为主表创建 CRUD。

所以添加屏幕应该显示: -

商店名称:- 下拉前缀:- 文本框

查看屏幕应该使用 store 表的 name 列而不是显示 store_id

感谢期待。

4

2 回答 2

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 是子级。要使其成为一对一关系,请将 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,而且它还做了一个时髦的双间接操作,因此您需要将变量声明放在单引号中。

于 2013-06-24T00:24:54.500 回答
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',
    ),
),

)); ?>

再次感谢 jmarkmurphy。非常感谢 。我的应用程序现在正在运行,并且完全按照我想要的方式运行。

于 2013-06-27T18:05:22.090 回答