2012-10-01 30 views
0

OK可以說我想從數據庫表中選擇一些列,但我不知道這些列在方法中的含義。我可以將它們傳入,但取決於調用數據庫方法的方法,它可能更多或更少。SQL SELECT *但有一個轉折點 - CodeIgniter

一個快速修復將是SELECT *,但我明白這是不好的,可能導致更多的數據被返回比必要的,我絕對不需要該表中的所有數據。

所以我使用CodeIgniter並準備了語句來做到這一點,下面是我目前(它的工作原理,只是指出)。

function get_pages() { 
     $this->db->select('pages.id, pages.title, pages.on_nav, pages.date_added, admin.first_name, admin.last_name') 
       ->from('pages, admin') 
       ->where('pages.admin_id = admin.id') 
       ->order_by('pages.id', 'ASC'); 

     $query = $this->db->get(); 

     return $query->result(); 
    } 

這是一個簡單的功能,但目前僅限於獲取'網頁'。我想將其轉換爲與其他表格一起工作。什麼是最好的方法?

非常感謝提前。

編輯在CodeIgniter中我有很多控制器。一個用於'網頁',一個用於'產品',一個用於'新聞'等等。我不想在每個控制器的模型中創建單個數據庫查詢方法。

+0

我似乎已經錯過了實際問題。你有什麼麻煩?這與** codeigniter **或** prepared-statement ** s有什麼關係?你究竟在做什麼*試圖做什麼? –

+0

我想從數據庫表中選擇多個列。該函數目前僅適用於一個表格,但我希望能夠根據調用數據庫get方法的方法從其他表格中進行選擇。我不想選擇所有的東西。 它要麼創建一個方法來執行它,要麼有多個包含相似代碼的方法。這似乎沒有必要。 –

+0

正在搜索'pages。*,admin.first_name,admin.last_name'? –

回答

0

我認爲沒有4種方法的願望是錯誤的。如果您沒有方法中的信息,則必須將其傳入。因此,您可以將字符串傳遞到所需的表中,並根據表名更改查詢,或者通過查詢的所有必要部分。這將包括表名,標準列,標準和要選擇的列。並且每次調用該函數時都需要傳遞該信息。這兩種方法都不會真的爲您節省大量代碼,並且它們對於各種用途而言都不如函數可讀。

+0

我也有過這樣的想法,但我並不確定,因爲過去我不必處理這個問題。我在創建個人方法方面犯了錯誤,但我不確定......感謝您的意見。 –

0

整個想法與模型把你的具體查詢到持久層在那裏。使用通用的catch-all方法可能是災難性的並且很難測試。你應該圍繞你想要解決的問題來塑造你的模型。

這使它更清潔,更容易使用。同時你也必須避免過大尺寸模型的共同陷阱。每個模型都應該遵循SRP。嘗試並分別關注問題,以便在您的控制器中,您可以輕鬆查看狀態更改。

這是有道理的,還是我只是漫步......?

+0

你建議的不僅是每個部分都有一個控制器,而且還有一個模型?我可以理解你爲什麼可以爲大型項目做到這一點,但這隻需要從數據庫中獲取東西。目前我有一個數據庫模型。雖然我可能把你解釋錯了。 –

+0

我可能是錯的 - 如果我是,我希望一個更有經驗的程序員會糾正我。 這真的取決於你的問題空間。您可以將一個控制器實現爲一個模型。這是將您的應用分成幾部分的一種方式。當你想開始一個新項目時,這使得它更加可重用。但是,您需要將模型更像一個圖層。這是您的持久層和應用程序的其餘部分之間的中介。 所以根據你的問題,我會說一個模型來獲取所有的頁面數據會沒事的。然而,隨着你的網站變大,你會注意到你的模型會變得相當大。 SRP是關鍵。 – thatonefreeman

0

在你的模型:

function get_pages($table_source) { 
    $this->db->select($table_source.".id"); // or $this->db->select('id'); 

// for instance, if one of your $table_source ="users" and there is no 'title' column you can write 
    if($table_source!='users') $this->db->select('title'); 

    $this->db->select('on_nav'); 
    $this->db->select('date_added'); 
    $this->db->select('admin.first_name'); 
    $this->db->select('admin.last_name'); 
    $this->db->join('admin','admin.id = '.$table_source.'.admin_id') 
    $this->db->order_by('pages.id', 'ASC'); 

    $query = $this->db->get($table_source); 

    return $query->result_array(); 
} 

在你的控制器:

function all_tables_info() { 
    $tables = array("pages","users","customers"); 
    $i=0; 
    foreach($tables as $table) { 
    $data[$i++]=$this->your_Model->get_pages($table); 
} 
    //do somthing with $data 
}