0

PHP で MVC を学習し、データベース アクセスに PDO を使用しています。

私のデータベースクラスは次のとおりです(データベース変数の構成ファイルでDEFINEを使用しています):

class Database extends PDO {

    public function __construct($dbconn ="mysql") {

        $options = array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING);

        switch($dbconn) {
            case 'usados':
                parent::__construct(DB_TYPE_USADOS . ':host=' . DB_HOST_USADOS . ';dbname=' . DB_NAME_USADOS, DB_USER_USADOS, DB_PASS_USADOS, $options);
                break;

            case 'autos':
                parent::__construct(DB_TYPE_AUTOS . ':host=' . DB_HOST_AUTOS . ';dbname=' . DB_NAME_AUTOS, DB_USER_AUTOS, DB_PASS_AUTOS, $options);
                break;

            case 'servicos':
                parent::__construct(DB_TYPE_SERVICOS . ':host=' . DB_HOST_SERVICOS . ';dbname=' . DB_NAME_SERVICOS, DB_USER_SERVICOS, DB_PASS_SERVICOS, $options);
                break;

            default:
                parent::__construct(DB_TYPE_MYSQL . ':host=' . DB_HOST_MYSQL . ';dbname=' . DB_NAME_MYSQL, DB_USER_MYSQL, DB_PASS_MYSQL, $options);
                break;
        }
    }
}

モデル例では、次のものがあります。

class Note_Model extends Model {

    public $errors = array();

    public function __construct() {
        parent::__construct($dbconn="mysql");
    }

    public function getAllNotes() {
        $sth = $this->db->prepare("SELECT user_id, note_id, note_text
                                    FROM note
                                    WHERE user_id = :user_id ;");
        $sth->execute(array(':user_id' => $_SESSION['user_id']));    

        return $sth->fetchAll();
    }
}

2 つの質問があります。

  1. 私のデータベース クラスでは、さまざまなデータベース接続 (さまざまなモデルで使用される) に対する私のアプローチは問題ありませんか? スイッチ構造はこの状況でうまく使用されており、接続先の変数はありますか?

  2. 異なるモデルの異なるデータベースに接続できますが、必要に応じて、1 つの同じモデルの異なるデータベースからデータを取得するにはどうすればよいでしょうか。たとえば、さまざまなソースからの情報を表示するダッシュボードを考えてみましょう。$this->dbだけじゃないですよね?

よろしくお願いします。

4

1 に答える 1

1

コンストラクター内の switch ステートメントは、クラスがやりすぎていることを示すコードの匂いです。4 つのクラス (PDO または独自の基本クラスを拡張する) を作成し、代わりにそれらを使用します。

モデルに関しては、私は MVC の専門家ではありませんが、同じサーバー上にある異なるデータベースのテーブルを結合できることは知っています。ただし、これにより、クラスごとに 1 つのデータベースのルールに違反する「ボス」クラスが発生する可能性があります。最良の方法は、おそらく、データに必要なモデルを尋ねる別のクラスを用意し、それをつなぎ合わせることです。

于 2013-09-21T18:35:29.503 に答える