Tôi đang cố gắng tìm hiểu xem tôi có đang sử dụng mẫu DAO chính xác không và cụ thể hơn, sự tồn tại của db trừu tượng sẽ như thế nào khi đến lớp bản đồ của tôi. Tôi đang sử dụng PDO làm đối tượng trừu tượng truy cập dữ liệu, nhưng đôi khi tôi tự hỏi liệu tôi có đang cố gắng trừu tượng hóa các truy vấn quá nhiều hay không.Đối tượng truy cập dữ liệu PHP
Tôi vừa bao gồm cách tôi trừu tượng các truy vấn chọn lọc, nhưng tôi đã viết các phương thức cho tất cả các hoạt động CRUD.
class DaoPDO {
function __construct() {
// connection settings
$this->db_host = '';
$this->db_user = '';
$this->db_pass = '';
$this->db_name = '';
}
function __destruct() {
// close connections when the object is destroyed
$this->dbh = null;
}
function db_connect() {
try {
/**
* connects to the database -
* the last line makes a persistent connection, which
* caches the connection instead of closing it
*/
$dbh = new PDO("mysql:host=$this->db_host;dbname=$this->db_name",
$this->db_user, $this->db_pass,
array(PDO::ATTR_PERSISTENT => true));
return $dbh;
} catch (PDOException $e) {
// eventually write this to a file
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
} // end db_connect()'
function select($table, array $columns, array $where = array(1=>1), $select_multiple = false) {
// connect to db
$dbh = $this->db_connect();
$where_columns = array();
$where_values = array();
foreach($where as $col => $val) {
$col = "$col = ?";
array_push($where_columns, $col);
array_push($where_values, $val);
}
// comma separated list
$columns = implode(",", $columns);
// does not currently support 'OR' arguments
$where_columns = implode(' AND ', $where_columns);
$stmt = $dbh->prepare("SELECT $columns
FROM $table
WHERE $where_columns");
$stmt->execute($where_values);
if (!$select_multiple) {
$result = $stmt->fetch(PDO::FETCH_OBJ);
return $result;
} else {
$results = array();
while ($row = $stmt->fetch(PDO::FETCH_OBJ)) {
array_push($results, $row);
}
return $results;
}
} // end select()
} // end class
Vì vậy, hai tôi hỏi:
Đây có phải là việc sử dụng đúng đắn về một DAO, hay tôi hiểu sai mục đích của nó?
Việc trừu tượng quá trình truy vấn ở mức độ này không cần thiết hay thậm chí không phổ biến? Đôi khi tôi cảm thấy như tôi đang cố gắng để làm cho mọi việc quá dễ dàng ...
Vì vậy, mỗi đối tượng tên miền trong Mô hình miền có thể/nên có đối tượng Dao có liên quan cho các hoạt động CRUD sau đó? – jerry
@saddog - Mỗi đối tượng cấp cơ sở, có. Ví dụ, một 'Order' và danh sách các con' LineItem' của nó có thể được lưu trữ cùng nhau thông qua 'OrderDao'. Thật không may, bạn hiếm khi có thể * cô lập hoàn toàn logic nghiệp vụ từ cách bạn tồn tại các đối tượng mô hình miền. –
Được rồi, điều đó thực sự mang lại một câu hỏi nữa, và sau đó tôi sẽ chấp nhận và cung cấp cho bạn tiền thưởng. Bạn đề cập đến trẻ em LineItem và tôi muốn chắc chắn rằng tôi sẽ xử lý những điều này một cách chính xác trong ứng dụng của tôi.Những đứa trẻ này có ánh xạ tới các bảng trong db (một bảng LineItem) và chỉ được hợp nhất trong đối tượng miền Order bởi Dao không? tức là một phương thức createObject trong DaoUser sẽ là phương thức kết hợp hai đối tượng này lại với nhau? – jerry