2010-04-17 56 views
1

我剛剛意識到我可能沒有遵循關於MVC模式的最佳實踐。將sql結果傳遞到視圖將數據庫列名硬編碼視圖

我的問題是,我的觀點「知道」我的數據庫信息

這裏是我的僞代碼的情況...

我控制器從我的模型調用方法並將它直接傳遞到視圖

view.records = tableGateway.getRecords() // gets array of records 
view.display() 
在我看來

each records as record 
    print record.name 
    print record.address 
    ... 

在我的v我有記錄。 名稱和記錄。 地址,這是硬編碼到我的數據庫的信息。這不好嗎?

除了迭代控制器中的所有內容並基本上重寫記錄集合之外,還有其他什麼方法。這似乎很愚蠢。

感謝


編輯
這裏有一個實際的視圖

<?php foreach($categories as $category): ?> 
    <tr> 
     <td><?php echo $category['name'] ?> </td> 
     <td><?php echo $category['fields'] ?> </td> 
     <td><?php echo $category['records'] ?></td> 
     <td><a href="/category/view/<?php echo $category['id'] ?>/<?php echo url::title($category['name']) ?>/">View</a></td> 
    </tr> 
<?php endforeach; ?> 

所以,通過數據的簡單循環將無法正常工作,我需要捕獲SQL結果的某些領域在我看來, 。

有沒有辦法解決這個問題?它讓我感到骯髒。

回答

1

我想說,如果你需要快速和骯髒地把這些信息硬編碼,這並不壞。

但考慮使用從db和某些數組描述使用哪些列的數據的方法具有視圖的泛型類。然後在子類(UserView,PostView,WhateverTableNameView)中,可以調用包含「名稱」,「地址」等數組的基本方法。

對不起,如果我正在說Python囉嗦,我來到PHP的這個問題標籤;)更多或更少的這樣

class BaseView { 
    public function display(& $data, array $columnNames) { 
     foreach($data as $row) { 
     foreach($columnNames as $c) { 
      echo $row->$c; // or $row[$c] or whatever your data is, I'm assuming objects 
     } 
     echo "\n"; 
    } 
} 

class UserView extends BaseView{ 
    public function display(& $data) { 
     parent::display($data, array('Name', 'Address'); 
    } 
} 

的好東西在這裏:

  • 需要一個多列?確保你查詢它,然後在UserView中修改1行。
  • 需要HTML列標籤文本(<th>東西) - 它已經在這裏。
  • $ data可能是資源描述符(think(while($ rs.nextRow()))而不是必需的完整數組,可能會佔用大量內存並需要時間從一個函數傳遞到另一個函數。
  • 如果你在這些記錄周圍尋找漂亮的HTML表格,你可以在應用程序中統一使用&,因爲只有一個地方可以定義它們。

如果由於某種原因,這並不能吸引你,真正通用的解決方案是有指標的,而不是列名。 $ data [$ i] [0],$ data [$ i] [1]等等......大多數數據庫API都提供了將列查詢爲名稱,數字或兩者的可能性。對於PHP + MySQL,請參閱http://www.php.net/manual/en/function.mysql-fetch-array.php

上的示例但是,由於您丟失了元數據信息,所以遲早會在$$中咬你。比方說,你以後要包裝你的「名稱」爲鏈接:

echo '<a href="user/',$record['id'],'">',$record['name'],'</a>'; 

好運氣在沒有列名可重用的方式做這個...

+0

我實際上使用kohana。我保持問題語言不可知,希望得到更多答覆。顯然它不起作用。我更新了我的問題......謝謝 – Galen 2010-04-17 14:57:14

+0

我不知道Kohana,但仍然...我的觀點是有一些幫助函數,將獲得數據源和第二個參數的某種提示源的元素應該是顯示。 – eyescream 2010-04-18 12:11:44

+0

似乎有點「髒」。我開始認爲可能沒有一種「乾淨」的方式來做到這一點。 – Galen 2010-04-18 18:01:36

1

的getter/setter和一段代碼映射記錄字段給他們,你可以刪除它,但你會增加一些複雜性。

真正的問題是:我是否需要重命名字段名稱?

通過一些規劃/思考/反饋,您應該不難找到在應用程序生存期中存在的字段的適當名稱。但是,如果字段的語義發生更改,則應添加一個新字段。這也有一個好處,你可以清楚地記錄它的棄用情況,並引導程序員到新的程序員。

相關問題