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