2014-08-29 94 views
0

我是一種新的Yii框架,這是關於找到最好的解決方案,我知道你可以用循環和所有,但我試圖找到一個更好的解決方案(如果有一個)。模型到多維數組

Structure (example): 
    Tv: id, price, size_id, brand_id 
    Brand: id, name 
    Size: id, inch, cm 

所以現在我想創建一個網格,該行將是Brands(例如:三星,索尼,LG)和列代表Sizes(例如:20" ,30" ,.. )和細胞將有Price的價值...

  40" 44" 48" 50" 
Brand1 $200 $240 $280 320 
Brand2 $180 $220 $240 300 
Brand3 $210 $230 $270 350 

同樣,我尋找做到這一點使用Yii/PHP的最佳解決方案。

+3

當你說你格都在談論一個CGridView或您自己的網格?對我來說,你可以用一個單一的Sql查詢來實現它 – darkheir 2014-08-29 19:40:56

+0

現在我使用自己的網格,你推薦使用CGridView嗎? – Ferdau 2014-08-30 17:58:58

+1

不知道你自己的網格是什麼,但我認爲最簡單的方法是使用一個自定義的SQL請求沒有ActiveRecord – darkheir 2014-08-30 18:16:22

回答

0

在這種情況下,使用CSqlDataProvider創建SQL。

這裏舉例:http://www.yiiframework.com/doc/api/1.1/CSqlDataProvider

如果您的網格不是從CGridView衍生,你應該考慮使用CGridView或重寫你的網格。 CGridView爲您提供開箱即用的分頁和ajax導航。例如,CGridView也可以很容易擴展,例如,你可以將表格移動到bootstrap,而不會在將來產生痛苦。

如果你想使用CActiveRecord,您可以在以下方式做到這一點:

  1. 添加干將的尺寸或改寫__get()Brand
public function get30InchPrice() { 
    $elems = $this->tvs(array('condition' => 'size_id=:e', 'params' => array('e' => 1))); 
    foreach($elems as $v) return $v->price; 
    return 0; 
} 
  1. 將姓名添加到attributeLabels()
  2. 配置CGridView使用您的特殊屬性:
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider, 
    'columns'=>array(
     '30InchPrice', 
     '40InchPrice', 
    ),));