2014-01-24 53 views
1

我需要基於使用PHP的數據庫(mysql)的信息生成html表。問題是我不知道表中有多少列和行(用戶可以添加列和行)。我不知道如何選擇特定的行「類型」。我有表選項,options_cats(選項類別)。當你知道你有多少列時,很容易,但是當你不知道時該怎麼辦? :)PHP/MySQL生成表

例子:

Size | Color | -> this will be column names(user can add many as he want), it's selected from options_cats table, column 'name'. 

現在我需要選擇類型選項(EX大小,顏色..),並把它放在正確的列。

<table class="table table-bordered"> 
      <thead> 
      <tr> 
       @foreach($ops as $op) 
       <th>{{$op->title}}</th> 
       @endforeach 
      </tr> 
      </thead> 
      <tbody> 
      @foreach($ops as $op) 
      <tr> 
       @foreach($op->options as $option) 
       <td>{{$option->name}}</td> 
       @endforeach 
      </tr> 
      @endforeach 

      </tbody> 
</table> 

$ OPS - >

public function options($prod_id) { 
     $data = array(); 
     $cats = DB::table('options_cats')->where('prod_id', $prod_id)->get(); 

     foreach ($cats as $cat) { 
      $cat->options = DB::table('options')->where('category', $cat->id) 
               ->where('prod_id', $cat->prod_id)->get(); 
      $data[] = $cat; 
     } 

     return $data; 



    } 

但現在的結果是:

Paper size Orientation 
A4   A3   
Landscape Portrait 

我會把列 '型' 後,我認識到如何使這個。

編輯: 我在管理一個頁面,在這裏我可以添加選項和類別選項,這個選項,當我添加新的類別選項,會出現輸入,可以在其中紙張添加選項(紙張尺寸前。)大小,例如。 A4(你可以添加很多,只要你想),如果我添加顏色選項類別爲前。比您需要爲添加的選項輸入紙張大小和顏色。我希望你現在明白了:)

+0

如果你只是想知道表中的列檢查模式:像這樣:'從schema.columns中選擇column_name其中TABLE_NAME = '。 – Melon

+0

表格列按行生成,options_cats表中的行'name'是列名稱。 – Mladen

+0

對不起,我想我不太明白你想要做什麼。請添加一些示例數據和操作 – Melon

回答

1

這是生成的列的數目可變表的一種方法:

<table class="table table-bordered"> 
    <thead> 
     <tr>Type</tr> 

     <tr> 
      @foreach($rows[0]['columns'] as $columns) 
       <th>{{$columns['title'])}}</th> 
      @endforeach 
     </tr> 
    </thead> 
    <tbody> 
     @foreach($rows as $row) 
      <tr> 
       <td>$rows['type']</td> 
      </tr> 

      <tr> 
       @foreach($row['columns'] as $column) 
        <td>{{$column['value']}}</td> 
       @endforeach 
      </tr> 
     @endforeach 
    </tbody> 
</table> 

要使用這同一個代碼,就必須產生與數據的數組像這樣的:

$rows = array( 
       array( 
         'type' => 'Car', 

         'columns' => array(
               array('title' => 'Color', 'value' => 'Blue'), 
               array('title' => 'Size', 'value' => '10'), 
              ), 

            array(
               array('title' => 'Color', 'value' => 'Red'), 
               array('title' => 'Size', 'value' => '11'), 
              ), 
        ), 

       array( 
         'type' => 'Paper', 

         'columns' => array(
               array('title' => 'Color', 'value' => 'Blue'), 
               array('title' => 'Size', 'value' => '10'), 
              ), 

            array(
               array('title' => 'Color', 'value' => 'Red'), 
               array('title' => 'Size', 'value' => '11'), 
              ), 
        ), 

      ); 

編輯

你發佈你的代碼,而我在寫我的回答和你的表看起來非常像我的,即使這個類是一樣的,它只是你正在使用集合,我正在使用數組。

EDIT 2

看起來你是在需要交換列和行。所以你有一些選擇:

1)通過SQL生成一個已經反轉的結果集。由於列數爲unknwown,你可能要處理動態SQL,這是在MySQL

爲例
SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT('MAX(CASE WHEN b.Race_Number = ', Race_Number, 
     ' THEN b.Place END) AS ', CONCAT('`Race', Race_Number, '`')) 
    ) INTO @sql 
FROM Table2; 

SET @sql = CONCAT('SELECT s.Student_name, ', @sql, ' 
        FROM Table1 a 
        LEFT JOIN Table2 b 
         ON ON a.ID = b.ID 
        GROUP BY a.ID, a.Name'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

2)一些更多的代碼添加到options()生成與結果的陣列。基本上你必須閱讀你的所有列並使它們成行。

3)使用Javascript在運行時交換它們。

+0

被編輯爲將'type'列作爲第一個'frozen'列進行硬編碼。 –

+0

添加新選項時,添加所有列。例如,如果列大小(顏色)比您需要添加的兩種顏色都大,則不能只添加一個。一行一個選項,包含大小,顏色等名稱。 – Mladen

+0

哦!你有每行可變數量的列?一列兩列,另一列三列? –