我正在構建一個小而簡單的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