0

OK、データベース テーブルからいくつかの列を選択したいとしますが、それらの列がメソッドに含まれているかわかりません。それらを渡すこともできましたが、データベース メソッドを呼び出すメソッドに応じて多かれ少なかれ変わる可能性があります。

簡単な修正は 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 には多くのコントローラーがあります。1 つは「ページ」、1 つは「製品」、1 つは「ニュース」などです。各コントローラーのモデルに単一のデータベース クエリ メソッドを作成したくありません。

4

3 に答える 3

0

4つの方法を持たないという願望は見当違いだと思います。メソッドに情報がない場合は、それを渡す必要があります。そのため、必要なテーブルを含む文字列を渡し、テーブル名に基づいてクエリを変更することを切り替えるか、渡すことができますクエリの必要なすべての部分。これには、テーブル名、基準列、基準、および選択する列が含まれます。関数を呼び出すたびに、その情報を渡す必要があります。これら 2 つの方法はどちらも実際には多くのコードを節約するものではありません。また、目的ごとに関数を使用するよりも可読性が低くなります。

于 2012-10-01T15:13:59.393 に答える
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
}
于 2012-10-02T21:30:58.570 に答える
0

そこにある永続化レイヤーに特定のクエリを配置するためのモデルを使用した全体的なアイデア。一般的なキャッチオール方式を使用すると、悲惨な結果を招き、テストが困難になる可能性があります。解決しようとしている問題に合わせてモデルを形成する必要があります。

これにより、よりクリーンで作業しやすくなります。同時に、モデルのサイズが大きくなりすぎるという一般的な落とし穴も回避する必要があります。各モデルは SRP に従う必要があります。コントローラーで状態の変化を簡単に確認できるように、懸念事項を分離してみてください。

それは理にかなっていますか、それとも私はとりとめのないですか...?

于 2012-10-01T15:20:41.150 に答える