结合模型-在控制器或使用新的层PHP MVC


Combining Models - in controller or use a new layer PHP MVC

有一个ActiveRecord样式类在php中,什么是正确的方式来传递一个模型的视图,一个模型包含外键/关系到其他模型?我的控制器应该实例化相关的类(user_id, category_id),然后将所有信息传递给视图,还是我应该在模型和控制器之间生成一个新的层,将两者结合起来?从本质上讲,我想我是在问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 */
}

我所有的类都继承了DatabaseTable的getById方法:

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() ; 
    }
    //...
}

MVC就足够了。你不需要在任何地方创建"新图层"。

在大多数情况下,您只接收(或使用相应的模型方法来获取)和显示视图侧的数据。例如,控制器初始化模型并将其传递给视图,以便视图调用模型中相应的方法来获取数据。

话虽如此,如果一个表与另一个表相关,并且如果您希望从两个表中获取所有数据,则可以在"引用"模型中创建方法来执行连接并返回组合结果。或者,如果您愿意,您可以在控制器端使用两个模型,并使用一个表中的键,并将其提供给另一个模型方法(作为参数),最后连接/合并输出。