Yii CGridview - 搜索/排序有效,但各个单元格上没有显示值

时间:2012-01-13 21:14:38

标签: activerecord yii

我对这个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
    )
  );

< /编辑>

如何访问各自列中的值?请帮忙! :(

2 个答案:

答案 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',
),

干杯