2017-09-01 6 views
0

私はMysqlからデータをフェッチする汎用モデル関数を作成しました。すべての選択データに対してこの機能を使用できます。codeigniterのモデル関数を簡略化する方法

//Controller 

$where = array('user_id' => 1); 
$data['all_rewards'] = $this->select->selectData('tbl_example1', $where, null, 'user_id', 10, 1); 

//Model 

public function selectData($table, $where, $group_by, $order_by, $limit, $start) { 
    $this->db->select('*'); 
    $this->db->from($table); 
    if(!empty($where)) 
     $this->db->where($where); 
    if(!empty($group_by)) 
     $this->db->group_by($group_by); 
    if(!empty($order_by)) 
     $this->db->order_by($order_by, 'DESC'); 
    if(!empty($limit) or !empty($start)) 
     $this->db->limit($limit, $start); 

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

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

上記のコードはうまくいきます。

私はデータベースからデータを選択する機能以外に単純化された方法があることを知りたいだけです。私のアプローチが正しいかどうか。

答えて

1

アプリケーションが成長し始めると、このアプローチが生き残るかどうかはわかりません。間もなく、あなたは普遍的な機能(例えば、「好きなものを選択」する必要がある場合や、(*)とは対照的に特定のフィールドだけを選択する必要がある場合など)によっては達成できない選択クエリを見つけることになります。

これは実際、優れたMVCアーキテクチャを作成する方法に関する幅広い質問です。

SelectAllまたはSelectOneやSelectRowのような典型的で簡単なクエリの簡略関数を記述しようとすると、可能なすべてのselect文を処理する単一の汎用関数を書くのではなく、やや良い方法があります。

一般に、モデルは、システム内のモデルによって表される特定のデータまたはdbテーブルにアクセスする方法を実装する必要があります。クエリを一般化する場合は、CodeIgniterクエリビルダを拡張し、モデルに拡張機能を使用することを検討してください。

のは、たとえば、あなたがテーブルから単一のフィールドを取得するための速記を必要としましょう:

function selectOne($table, $field, $id){ 
    $this->db->select($field); 
    $this->db->from($table); 
    $this->db->where('id', $id); 
} 

この関数呼び出しは非常に読みやすく、自己文書のようになります。

selectOne('product', 'price', 5); 

この方法アプリケーションでデータを取得する一般的な方法を抽象化することができます。

関連する問題