2012-05-30 76 views
-1

我面臨的一個問題是有許多查詢具有類似的選擇語句,但不同的連接/ where語句。處理一組select語句但條件不同的好方法是什麼?

下面是我通過CodeIgniter處理的代碼示例。我通常做的是做一個函數get(),它接受一個隨機鍵/值的數組。根據傳遞的鍵/值,它將生成並運行適當的查詢。現在,我想知道這是做事的好方法嗎?因爲你可以看到,這個功能變得越來越複雜。最初,我有一些函數,如get_all(),get_only_lessons()等,但它變得有點煩人不得不重複相同的一組代碼與一兩行不同。

我的問題是處理這個問題的最好方法是什麼。

function get($param = NULL) 
{ 
    /* 
    SELECT m.id AS id, CAST(m.order_number AS SIGNED) AS order_number, m.name AS name, m.permalink as permalink, 
     m.suplesson_id as suplesson_id, CAST(sm.order_number AS SIGNED) AS suplesson_order_number 
    FROM lessons m 
    JOIN courses c ON m.course_id = c.id 
    LEFT JOIN lessons sm ON m.suplesson_id = sm.id 
    WHERE [various] 
    */ 

    $select = 'm.id AS id, CAST(m.order_number AS SIGNED) AS order_number, m.name AS name, m.permalink as permalink, '; 
    $select .= ' m.suplesson_id as suplesson_id'; 

    if (isset($param['id']) || isset($param['suplesson_order_number']) || isset($param['permalink'])) 
     $select .= ', CAST(sm.order_number AS SIGNED) AS suplesson_order_number '; 

    $this->db->select($select); 
    $this->db->from($this->table_name.' m'); 
    $this->db->join($this->courses_table_name.' c', 'm.course_id = c.id'); 

    if (isset($param['id']) || isset($param['suplesson_order_number']) || isset($param['permalink'])) 
     $this->db->join($this->table_name.' sm', 'm.suplesson_id = sm.id', 'left'); 

    // where clauses 
    if (isset($param['course_id'])) 
     $this->db->where(array('c.id' => $param['course_id'])); 
    if (isset($param['id'])) 
     $this->db->where(array('m.id' => $param['id'])); 
    if (isset($param['order_number'])) 
     $this->db->where(array('m.order_number' => $param['order_number'])); 
    if (isset($param['permalink'])) 
     $this->db->like('m.permalink', $param['permalink'], 'none'); 
    if (isset($param['suplesson_id'])) 
     $this->db->where(array('m.suplesson_id' => $param['suplesson_id'])); 
    if (isset($param['suplesson_order_number'])) 
     $this->db->where(array('sm.order_number' => $param['suplesson_order_number'])); 
    if (isset($param['NULL'])) 
     $this->db->where('m.'.$param['NULL'].' IS NULL'); 
    if (isset($param['NOT NULL'])) 
     $this->db->where('m.'.$param['NOT NULL'].' IS NOT NULL'); 

    $this->db->order_by('order_number'); 

    // filter based on num_rows/offset 
    if (isset($param['id']) || isset($param['permalink'])) 
     $this->db->limit(1); 
    if (isset($param['num_rows']) && isset($param['offset'])) 
     $this->db->limit($param['num_rows'], $param['offset']); 

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

    // return row if expecting 1 result 
    if (isset($param['id']) || isset($param['suplesson_order_number']) || isset($param['permalink'])) 
     return ($query->num_rows() == 1) ? $query->row_array() : NULL; 

    return ($query->num_rows() > 0) ? $query->result_array() : NULL; 
} 

回答

0

運行的數據庫查詢通常使用的方法是構建模型的代碼有多個函數調用,每一個涉及到一個SQL語句,例如:

function get_user($userId) 
{ 
    $this->db->get_where('user', array('userId' => $userId)) 
    //... 
    //...   
} 

function delete_user($userId) 
{ 
    $this->db->delete('user',array('userId' => $userId)) 
} 

您可以創建一個模型類所謂User_model所以在你的控制器,你廁所打電話到具體的型號功能

$user = $this->User_model->get_user($userId) 

這其中包含了所有你需要的讀/更新用戶表,函數像你正在試圖構建一個巨型模型函數,它會檢查各種參數以確定要運行的SQL語句。這不是很好的設計,並且不符合Codeignitors MVC模型。 而是爲每個表創建一個單獨的模型,然後在每個模型中爲您希望運行的每個SQL操作創建單獨的函數。從您的控制器調用這些模型以獲取/更新/刪除表中的數據。

+0

你的例子就是我最初做的。我想最好是按照你所說的將每個查詢保存在它自己的函數中。感謝您澄清我的誤解。 – Mikey

相關問題