2011-05-27 109 views
1

我在理解CSqlDataProvider以及它的工作原理时遇到了一些麻烦。Yii CSqlDataProvider混淆

在我使用CActiveDataProvider,结果可以如下获得:

$data->userProfile['first_name']; 

然而,当我使用CSqlDataProvider,据我所知,结果如阵列不是对象返回。但是,阵列的结构是平坦的。换句话说,我看到下面的数组:

$data['first_name'] 

,而不是

$data['userProfile']['first_name'] 

但这里的问题是什么,如果我有另一个连接表(姑且称之为“作者”)在我的sql还包含first_name字段的代码?随着CActiveDataProvider,这两个字段消除歧义,所以我可以做以下访问这两个领域:

$data->userProfile['first_name']; 
$data->author['first_name']; 

但随着CSqlDataProvider,似乎没有成为反正我可以按如下方式访问数据:

$data['userProfile']['first_name']; 
$data['author']['first_name']; 

所以,我直接SQL中分配一个唯一的名称,以这些领域,通过做这样的事情之外:

select author.first_name as author_first_name, userProfile.first_name as user_first_name 

然后指给他们这样的:

$ data ['author_first_name']; $ data ['user_first_name']

有没有办法让CSqlDataProvider自动构造数组,使它们以CActiveDataProvider对象的相同方式嵌套?所以,我可以通过使用$ data ['userProfile'] ['first_name']

或者是否有另一个类我应该用来获取这些类型的嵌套数组?

非常感谢!

回答

2

据我所知,没有Yii DB方法将JOIN查询结果分解为二维数组,如您正在寻找。我认为您需要 - 如您所建议的 - 在您的select语句中将列名称别名。

当您在查询中JOIN表时,MySql返回单行数据,并且CSqlDataProvider正好返回MySql所做的操作:单列表数组表示由列名索引/键入的单个表格数组表示,就像查询返回一样。

如果你想你的结果分裂成一个多维数组我要么别名列,或使用常规CActiveDataProvider(你还可以通过复杂的查询,并通过CDbCritiera加入在)。