0

PHPでActiveRecordスタイルのクラスを持っていますが、他のモデルへの外部キー/関係を含むモデルのビューにモデルを渡す正しい方法は何ですか? コントローラーは関連するクラス (user_id、category_id) をインスタンス化してから、すべての情報をビューに渡す必要がありますか、それともモデルとコントローラーの間に 2 つを組み合わせた新しいレイヤーを生成する必要がありますか? 本質的に、私はSQLの「結合」クエリがどこに行くべきかを尋ねていると思いますか?

私のデータベースには、次のような Article というテーブルがあります。

+------------------+------------+------+-----+-------------------+-----------------------------+
| Field            | Type       | Null | Key | Default           | Extra                       |
+------------------+------------+------+-----+-------------------+-----------------------------+
| id               | int(11)    | NO   | PRI | NULL              | auto_increment              |
| user_id          | int(11)    | NO   | MUL | NULL              |                             |
| title            | char(30)   | NO   |     | NULL              |                             |
| subtitle         | char(60)   | YES  |     | NULL              |                             |
| time             | timestamp  | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| visible          | tinyint(1) | NO   |     | 1                 |                             |
| body             | mediumtext | YES  |     | NULL              |                             |
| category_id      | int(10)    | NO   | MUL | NULL              |                             |
| featured_mediaid | int(10)    | YES  |     | NULL              |                             |
+------------------+------------+------+-----+-------------------+-----------------------------+

このテーブルを記事クラスに実装しました。

Class Article extends DatabaseTable{

    public $id = null;
    public $title = null;
    public $subtitle = null;
    public $body = null;
    public $time = null;
    public $visible = null;
    public $category_id = null;
    public $user_id = null; 
    public $featured_mediaid = null;

/*.....methods for  Article*/

}

および関連するテーブル:

+-------------+------------+------+-----+---------+----------------+
| Field       | Type       | Null | Key | Default | Extra          |
+-------------+------------+------+-----+---------+----------------+
| id          | int(11)    | NO   | PRI | NULL    | auto_increment |
| name        | char(50)   | NO   | UNI | NULL    |                |
| description | char(50)   | NO   |     |         |                |
| visible     | tinyint(1) | NO   |     | 1       |                |
+-------------+------------+------+-----+---------+----------------+

およびカテゴリ クラス:

Class Category extends DatabaseTable {

    public $id = null;
    public $name = null;
    public $description = null;
    public $visible = null;

    /*... Some methods here */
}

すべてのクラスは、getById メソッドを持つ DatabaseTable から継承します。

Class DatabaseTable {
    // ...
    public static function getById($id){
        try {
            $connection = new PDO(Database::DB_DSN, Database::DB_USERNAME, Database::DB_PASSWORD);
            $sql = "SELECT * FROM " . strtolower(self::get_called()) . " WHERE id = :id";
            $statement = $connection->prepare($sql);
            $statement->bindValue(":id", (int) $id, PDO::PARAM_INT);
            $statement->execute();
            $row = $statement->fetch(PDO::FETCH_ASSOC);
            $connection = null; 
        }
        /*catch(PDOException $exception) {

        }*/
        catch(Exception $exception) {
            echo "An Unknown Exception Occured";
            echo "Calling Class [" . self::get_called() . "] " . "Method [" . __FUNCTION__ . "]" ;
            $connection = null;
            echo $exception->getMessage();
        }
        $class = self::get_called();
        return new $class($row);
    }

    public static function get_called(){
        return get_called_class() ; 
    }
    //...

}
4

1 に答える 1

1

MVCで十分です。どこにも「新しいレイヤー」を作成する必要はありません。

ほとんどの場合、ビュー側でデータを受信 (または対応するモデル メソッドを使用してフェッチ) して表示するだけです。つまり、コントローラーはモデルを開始してビューに渡し、ビューがモデル内の対応するメソッドを呼び出してデータを取得します。

そうは言っても、テーブルが別のテーブルに関連しており、両方のテーブルからすべてのデータを取得したい場合は、「参照」モデルでメソッドを作成して、結合を行い、結合された結果を返すことができます。または、必要に応じて、2 つのモデルを使用してコントローラー側でこれを行い、1 つのテーブルのキーを使用して別のモデル メソッドに (引数として) 渡し、最後に出力を結合/マージすることができます。

于 2013-05-27T10:55:27.140 に答える