我对这个Yii CGridView问题感到半沮丧,任何帮助或指导都会受到高度赞赏。
我有两个相关的表商店(shop_id主要)和联系人(shop_id foreign),这样一个商店可能有多个联系人。我正在使用CGridview来提取记录和排序,我在商店模型中的关系功能就像:
'shopscontact' => array(self::HAS_MANY, 'Shopsmodel', 'shop_id');
在商店网格上,我需要显示任何一个可用联系人的商店行。我试图过滤,搜索网格已经很好了,但我陷入了一个非常奇怪的问题。相应的网格列不显示预期的值。
在CGridview文件中,我正在做类似
的事情 array(
'name' => 'shopscontact.contact_firstname',
'header' => 'First Name',
'value' => '$data->shopscontact->contact_firstname'
),
显示联系人的名字。但是,即使在搜索/排序都工作的情况下(我通过检查数据库关联发现),网格列也是空的! :(当我做一个var_dump
array(
'name' => 'shopscontact.contact_firstname',
'header' => 'First Name',
'value' => 'var_dump($data->shopscontact)'
),
转储在_private属性中显示记录值,如下所示:
private '_attributes' (CActiveRecord) =>
array
'contact_firstname' => string 'rec1' (length=4)
'contact_lastname' => string 'rec1 lsname' (length=11)
'contact_id' => string '1' (length=1)
<修改:>
模型中的标准代码如下:
$criteria->with = array(
'owner',
'states',
'shopscontacts' => array(
'alias' => 'shopscontacts',
'select' => 'shopscontacts.contact_firstname,shopscontacts.contact_lastname',
'together' => true
)
);
< /编辑>
如何访问各自列中的值?请帮忙! :(
答案 0 :(得分:2)
由于'shopscontact'是has-many关系的名称,$data->shopscontact
应该返回一个与所有商店相关的数组...你修改了关系以便只返回一条记录(如果我没错你,你只需要显示一个,对吗?)?如果你这样做了,我可以看一下你的过滤代码吗?
P.S。需要一种快速但时间紧迫的解决方案:您是否尝试过'value' => '$data->shopscontact['contact_firstname']'
?
答案 1 :(得分:2)
嗯,我没有使用with()和together()方法。有趣的是,在列的“值”部分,$data->shopscontacts
如何基于relations()
定义加载关系fresh(并且不基于您声明的criteria
)。
处理数组输出的更简洁方法可能是这样的:
'value' => 'array_shift($data->shopscontacts)->contact_lastname'
或许更好的方法,就是在shops
模型中设置一个新的(额外的)关系:
public function relations()
{
return array(
'shopscontacts' => array(self::HAS_MANY, 'Shopsmodel', 'shop_id'), // original
'firstShopscontact' => array(self::HAS_ONE, 'Shopsmodel', 'shop_id'), // the new relation
);
}
然后,在你的CGridView中你可以像这样设置一个列:
'columns'=>array(
'firstShopscontact.contact_lastname',
),
干杯