Php Yii框架:通过外键显示关联的表条目并对其进行搜索

Php Yii框架:通过外键显示关联的表条目并对其进行搜索,php,yii,Php,Yii,您好,我是Yii框架的新手,我正在关注Larry Ullman的教程系列。 我有一个员工模型和一个部门模型。 部门模型与员工模型有很多关系,部门ID是员工模型中的外键 在“管理”视图中,我有一个搜索栏,后跟一个员工列表,我想显示部门名称而不是部门ID,并通过部门名称进行搜索。 为了进行尝试,我编写了以下代码,其中包含一个与departmentId字段对应的数组。 此选项适用于查看操作,但不适用于管理操作 请帮忙 <?php echo CHtml::link('Advanced Searc

您好,我是Yii框架的新手,我正在关注Larry Ullman的教程系列。 我有一个员工模型和一个部门模型。 部门模型员工模型有很多关系,部门ID是员工模型中的外键

在“管理”视图中,我有一个搜索栏,后跟一个员工列表,我想显示部门名称而不是部门ID,并通过部门名称进行搜索。 为了进行尝试,我编写了以下代码,其中包含一个与departmentId字段对应的数组。 此选项适用于查看操作,但不适用于管理操作

请帮忙

<?php 
echo CHtml::link('Advanced Search','#',array('class'=>'search-button')); ?>
<div class="search-form" style="display:none">
<?php $this->renderPartial('_search',array(
'model'=>$model,
)); 
?>
</div><!-- search-form -->

<?php 
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'employee-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
    'id',
    array(
    'name'=>'departmentId',
    'value'=>$model->department->name,
    ),
    //'departmentId',
    'firstName',
    'lastName',
    'email',
    'ext',
    /*
    'hireDate',
    'leaveDate',
    */
    array(
        'class'=>'CButtonColumn',
    ),
),
)); ?>

我假设,您的视图操作只是从单个模型生成的列表视图。此代码在这种情况下不起作用,因为CGridView正在使用您正在使用
$model->search()
指定的CActiveDataProvider返回的数据生成每一行。因此,在本例中,
$model
只是当前模型,不包含查询生成的数据


为了实现这一点,
value
应该是一个字符串,CGridView可以将其作为PHP代码进行计算。所以它应该是这样的
'value'=>'$data->department->name;'
$data
是Yii用于向CDATA列提供当前行的变量)。

我发现在gridview中创建额外可搜索关系列的最佳方法是使用以下模式:

//模型类
类产品扩展了CActiveRecord{
//在模型类中创建自定义字段以保存搜索数据
public$searchSupplierName;
// [...]
//确保在规则中设置自定义字段是安全的
公共职能规则(){
返回数组(
// [...]
//将自定义字段名添加到此规则
数组('id,searchSupplierName','safe','on'=>'search'),
);
}
//编辑您的搜索功能
公共函数搜索(){
// [...]
//在搜索中使用自定义属性的值作为条件
$criteria->compare('supplier.name',$this->searchSupplierName,true);
//您可以使用如下内容
//以确保不会触发延迟加载查询
//对于gridview上显示的每个结果。
如果($this->searchSupplierName)
$criteria->with=数组('supplier');
//如果您希望能够在字段上进行排序,请执行类似的操作
返回新的CActiveDataProvider($this,array(
“条件”=>$criteria,
'排序'=>数组(
'属性'=>数组(
“searchSupplierName”=>数组(
'asc'=>'supplier.name',
'desc'=>'supplier.name desc',
),
“*”,//这确保字段排序的其余部分继续工作
),
),
));
}
}
//在模板中
这个解决方案应该适用于(几乎)任何您想要的情况。如果你想对专栏进行基于文本的过滤,这是我能想到的最好的解决方案


但也有。例如,如果您只想通过使用组合框搜索
关系\u id
,找到正确的值,则有。

同意ethan。也可以使用匿名函数
'value'=>函数($data,$row){return$data->department->name;}
-PHP5.3+当我执行$data时,它显示
未定义变量:data
我需要在代码中传递任何内容吗?您确定在代码周围添加了引号吗<代码>'$data->部门->名称;'而不是此
$data->department->name。我知道它看起来很奇怪(这就是为什么我更喜欢使用@Alexander Kononenko所描述的方法),但它应该是有效的。@TommyBravo爱你,伙计,你救了我一天:)它只适用于你建议的引用。在我的例子中,它的工作原理如下:$this->widget('zii.widgets.grid.CGridView',array('id'=>'activity-grid','dataProvider'=>$model->search(),'filter'=>$model,'columns'=>array(//'id',array('name'=>'employee_id','value'=>“$data->employee->first_name',/$data是gridview中可访问的成员行),