组合模型-在控制器中或使用新层PHP MVC

组合模型-在控制器中或使用新层PHP MVC,php,Php,在php中有一个ActiveRecord样式的类,对于包含外键/与其他模型的关系的模型,将模型传递给视图的正确方法是什么?我的控制器应该实例化相关类(user\u id、category\u id),然后将所有信息传递给视图,还是应该在模型和控制器之间生成一个新层,将两者结合起来?本质上,我想我是在问sql“join”查询应该去哪里 在我的数据库中有一个名为Article的表 +------------------+------------+------+-----+--------------

在php中有一个ActiveRecord样式的类,对于包含外键/与其他模型的关系的模型,将模型传递给视图的正确方法是什么?我的控制器应该实例化相关类(user\u id、category\u id),然后将所有信息传递给视图,还是应该在模型和控制器之间生成一个新层,将两者结合起来?本质上,我想我是在问sql“join”查询应该去哪里

在我的数据库中有一个名为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继承,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已经足够了。您不需要在任何地方创建“新层”

在大多数情况下,您仅在视图端接收(或使用相应的模型方法获取)和显示数据。i、 e控制器启动模型并将其传递给视图,以便视图调用模型中相应的方法来获取数据


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

半轻率的响应:使用原则:-)谢谢,我认为在控制器中进行工作对我来说最有意义