组合模型-在控制器中或使用新层PHP MVC
在php中有一个ActiveRecord样式的类,对于包含外键/与其他模型的关系的模型,将模型传递给视图的正确方法是什么?我的控制器应该实例化相关类(user\u id、category\u id),然后将所有信息传递给视图,还是应该在模型和控制器之间生成一个新层,将两者结合起来?本质上,我想我是在问sql“join”查询应该去哪里 在我的数据库中有一个名为Article的表组合模型-在控制器中或使用新层PHP MVC,php,Php,在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”模型中创建方法来进行连接并返回组合结果。或者,如果您愿意,您可以在控制器端使用这两个模型,并使用一个表中的键,将其交给另一个模型方法(作为参数),最后连接/合并输出。半轻率的响应:使用原则:-)谢谢,我认为在控制器中进行工作对我来说最有意义