我还在处理OOP,但我正在尝试使用单例数据库连接对象(#1)获取的数据创建一个“Order”对象。
我通过获取一个订单号数组然后迭代它们来实现这一目标(#2),创建Order对象,将订单号传递给类,我希望Order类使用它来查询数据库单例数据库连接以获取有关每个订单的更多信息并填充其属性(#3)。我的想法是,如果Order类超出了订单标识符,那么它将更容易维护并且非常灵活。
我知道我可以从getOrders()获取数据并将其传递给类,但如果我决定需要另一个字段,我不想修改50个不同的查询!
这很有用,但是如果我有10个订单,那么只有最后一个订单对象用数据库中的数据填充。我假设数据库连接在有时间完成并填充它的属性之前正在被重用?
这是一些代码......
class Example {
protected $dBCon;
#1
//class constructor
public function __construct() {
//connect to SQL database
$this->dBCon = DB::getInstance();
}
#2
public function getOrders() {
$orders = array();
$sql="SELECT ORDNUMBER FROM ORDERS";
$result = $this->dBCon->executeCommand($sql);
foreach ($result as $row) {
$order = new Order($row['ORDNUMBER']);
$orders[] = $order;
}
return $orders;
}
}
class Order extends Example {
public $order_number;
public $customer;
public $price_list;
#3
public function __construct($order_number) {
if ($order_number) {
//create Order from existing order
//connect to SQL database
$this->dBCon = DB::getInstance();
$sql = "SELECT * FROM ORDERS WHERE ORDNUMBER = ?";
$result = $this->dBCon->executePreparedStatement($sql, array($order_number));
$this->order_number = $order_number;
foreach ($result as $row) {
$this->customer = new Customer($row['CUSTOMER']);
$this->price_list = $row['PRICELIST'];
}
}
}
因此,调用getOrders()可以为我提供10个订单对象,但只有最后一个包含任何数据。您还可以看到我想为每个订单执行与Customer对象类似的操作。
我还尝试创建一个新的数据库连接实例,这确实为每个创建的对象获取数据,但是我知道我可能会创建很多数据库连接!
这是解决这个问题的正确方法吗?还是我完全弄错了OOP棒!?
答案 0 :(得分:0)
我会先使Order
变得非常简单:
class Order
{
public $order_number;
public $customer;
public $price_list;
}
它对SQL或任何形式的数据库都一无所知。然后,您可以选择一步或两步加载这些对象;让我们现在就一步到位。
class OrderGateway
{
public static function getOrders(PDO $db)
{
$orders = array();
$stmt = $db->query('SELECT * FROM `orders`');
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
$order = new Order();
$order->order_number = $row['ORDNUMBER'];
$order->customer = new Customer($row['CUSTOMER']);
$order->price_list = $row['PRICELIST'];
$orders[] = $order;
}
return $orders;
}
}
$orders = OrderFactory::getOrders($db);
通过引入位于网关和数据类之间的数据映射器类,可以进一步改进这一点。您可以在搜索“数据映射器模式”时阅读此内容。