我正在寻找关于在将对象集合持久保存到数据库时如何使用封装的最佳实践建议。
例如,您需要持久化一个拥有一系列产品的分销商。如果您保持封装并且不弄乱与分销商类中的产品表相关的数据库内容,则您需要对数据库进行太多点击以将每个单个产品保存在一个循环中。代码如下所示:
class Distributor {
private $products;
function save() {
foreach ($products as $prod) {
// 10000 products = 10000 hits to the DB! Instead of only one!
$prod->save();
}
}
}
另一方面,如果您想优化查询并执行多行插入/插入更新,您可以执行更复杂的操作,如下所示:
class Distributor {
private $products;
$query = $dao->getInsertUpdateQueryInstance();
foreach ($products as $prod) {
// Much extra code for implementing such an encapsulation.
$query->addRow($prod->getRow());
}
$query->execute();
}
这意味着您需要使用 addRow() 等特定函数编写 DAO 层。
我看到的第三种可能性是在 Product 类中创建一个静态数组,但这打破了关注点的逻辑分离。现在产品列表保存在同一产品类中,而不是与其经销商相关。
class Distributor {
// I'm a distributor and I have nothing to do...
}
class Product {
private static $products;
function save() {
foreach (self::products as $prod) {
// add row
}
// persist 10000 rows
}
}
封装,但是太丑了!如果您有多个分销商怎么办?所有产品都将保留在同一个数组中?
有没有一些简单的方法来实现这一点?ORM是唯一的出路吗?