我正在构建一个小而简单的PHP内容管理系统,并选择采用MVC设计模式。PHP MVC模型关系 - MySQL
我很努力地掌握我的模型应该如何与数据库结合使用。
我想分开数据库查询本身,所以如果我们选择在将来更改数据库引擎,很容易这样做。
作为一个基本的概念,下面提出的解决方案是否有效,是否有更好的方法来处理这种方法有什么缺陷?
首先,我有一个数据库类来处理的代码,所有MySQL的某些片段:
class Database
{
protected $table_name;
protected $primary_key;
private $db;
public function __construct()
{
$this->db = DatabaseFactory::getFactory()->getConnection();
}
public function query($sql)
{
$query = $this->db->prepare($sql);
$query->execute();
return $query->fetchAll();
}
public function loadSingle($id)
{
$sql = "SELECT * FROM $this->table_name WHERE $this->primary_key = $id";
return $this->query($sql);
}
public function loadAll()
{
$sql = "SELECT * FROM $this->table_name";
return $this->query($sql);
}
}
其次,我有一个模型,在这种情况下握住我的所有菜单项:
class MenuItemModel
{
public $menu_name;
public $menu_url;
private $data;
public function __construct($data)
{
$this->data = $data;
$this->menu_name = $data['menu_name'];
$this->menu_url = $data['menu_url'];
}
}
最后,我想有一个“工厂”拉两个在一起:
class MenuItemModelFactory extends Database
{
public function __construct() {
$this->table_name = 'menus';
$this->primary_key = 'menu_id';
parent::__construct();
}
public function loadById($id)
{
$data = parent::loadSingle($this->table_name, $this->primary_key, $id);
return new MenuItemModel($data);
}
public function loadAll()
{
$list = array();
$data = parent::loadAll();
foreach ($data as $row) {
$list[] = new MenuItemModel($row);
}
return $list;
}
}
看看[存储库模式](http://stackoverflow.com/questions/16176990/proper-repository-pattern-design-in-php) – thodic