我在理解CSqlDataProvider和它的工作原理时遇到了一些问题。
当我使用CActiveDataProvider时,可以按如下方式访问结果:
$data->userProfile['first_name'];但是,当我使用CSqlDataProvider时,我知道结果是以数组而不是对象的形式返回的。但是,数组的结构是扁平的。换句话说,我看到了以下数组:
$data['first_name'] 而不是
$data['userProfile']['first_name']但是这里的问题是,如果我的sql代码中有另一个包含first_name字段的连接表(让我们称它为'author'),该怎么办?使用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‘调用它们。
或者我应该使用另一个类来获得这些类型的嵌套数组?
非常感谢!
发布于 2011-05-31 00:56:20
据我所知,没有Yii DB方法像您所寻找的那样将连接查询结果分解到2D数组中。我认为您需要按照您的建议在select语句中给列名加上别名。
当您在查询中联接表时,MySql返回一行数据,而CSqlDataProvider返回MySql所做的事情:按列名索引/键控的单个表格式数组表示,就像您的查询返回的那样。
如果您想将结果分解到一个多维数组中,我可以给列加上别名,或者使用常规的CActiveDataProvider (您仍然可以通过CDbCritiera传递复杂的查询和连接)。
https://stackoverflow.com/questions/6153344
复制相似问题