1

したがって、CodeIgniter の拡張モデル (MY_Model) に次のコードがあります。

function get($options = array(), $selects = array(), $joins = array(), $table, $object = TRUE)
{

    if(!empty($options))
    {
        foreach($options as $option => $array)
        {
            foreach($array as $column => $value)
            {
                $this->db->{$option}($column, $value);
            }
        }
    }

    if(!empty($select))
    {
        foreach($selects as $select)
        {
            $this->db->select($select);
        }
    }

    if(!empty($joins))
    {
        foreach($joins as $join => $array)
        {
            foreach($array as $jointable => $column)
            {
                $this->db->join($join, $join.'.'.$column.'='.$jointable.'.'.$column);
            }
        }
    }


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

    return $query->result();

}

以下のような配列を渡すことができる場所:

    $options = array(
        'where' => array(
            'companys.companyID' => $companyID
        )
    );

    $select = array(
        'companyID',
        'companyName'
    );

    $join = array(
        'persons' => array(
            'companys' => 'companyID'
        )
    );

    $result = $this->companyModel->get($options, $select, $join, 'companys');

    print_r('<pre>');
    print_r($result);

私の質問は、これが良い考えではない理由があるかということです。私は自分の MY_Model でデフォルトの CI_Model を拡張しました。その後、他のすべてのモデルはこの get を使用でき、独自の関数を引き続き使用できます。他の基本的な CRUD アクションにも同様の機能があります。

もう 1 つの方法は、モデル内の関数を分離してほとんどの作業を行い、可能な限り最小のコントローラーを最適なルートにする方法です。それが、すべてのモデルで同じコードのチャンクを書き直すことを意味するとしても?

ばかげた質問ではないことを願っています。または、MVC の核となる部分を誤解していますが、とにかく返信に感謝します。

4

1 に答える 1

0

SQL を抽象化しようとする開発者の長い列にようこそ。;)

データベースの抽象化は Web アプリケーションの中心的な概念ですが、モデルはドメインを反映するデータとメソッドのコレクションとして記述されているだけなので、MVC パターンの一部ではありません。実際には、これは多くの場合、これを行うためのビジネス メソッドとコールバックがあることを意味します。データをどのように永続化するかは、あなた次第です。何をすべきかのアイデアを与えるパターンの例は ここにあります。また、たまたまバージョン 1.x でActiveRecordを使用している Doctrine も見てください。最近バージョン 2.0 で、ファクトリを使用したより単純なエンティティ パターンに変更されました。

あなたの方法はそのままで、私にはうまく見えます。ただし、警告があります。曲げすぎないでください。フレームワークではなくアプリケーションを作成している場合は、ビジネスだけでなく技術的な側面でもドメインを自由に受け入れることができます。この方法では不可能なクエリを処理していることに気付いた場合は、メソッドを変更せずに実際のクエリを使用してください。

于 2011-10-19T08:51:03.027 に答える