2011-05-27 67 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加入在)。