0

在php中有一个ActiveRecord样式类,将模型传递给包含外键/与其他模型的关系的模型的视图的正确方法是什么?我的控制器应该实例化相关类(user_id、category_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 */
}

我所有的类都继承自具有 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就足够了。您无需在任何地方创建“新图层”。

在大多数情况下,您只接收(或使用相应的模型方法来获取)并在视图端显示数据。即控制器发起模型并将模型传递给视图,以便视图调用模型中的相应方法来获取数据。

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

于 2013-05-27T10:55:27.140 回答