在另一个DAO中使用DAO - 好的还是坏的做法?

时间:2010-01-22 00:52:46

标签: php database oop

这可能是非常简单的事情,但我是一些面向对象模式的新手。

简单地说,在另一个DAO中使用来自一个DAO的方法是不好的做法?我试图在DAO中创建一个实体,并发现很难使用该DAO 创建该实体。那么,在其他DAO中使用其他DAO方法是否可以?

示例:

public function readAllUsers() {
    $sql = "SELECT * FROM user";
    return $this->execute($sql);
}

public function execute($sql) {
$result = mysql_query($sql, $this->getDBConnection())
                or die(mysql_error());
    $user = array();
    if(mysql_num_rows($result) > 0) {
        for($i = 0; $i < mysql_num_rows($result); $i++) {
            $row = mysql_fetch_assoc($result);
            $user[$i]->setUsername(row["userName"]);
             ...set user info...
            $user[$i]->setAddresses($addressDAO->readAddressByUserId($userId));
        }
    }
    return $user;
}

注意:在用户实体中有很多类似的属性与实体本身(地址,电子邮件,电话号码等)有一对多的关系。需要的查询(使用所有链接表)将非常复杂。

谢谢,

史蒂夫

1 个答案:

答案 0 :(得分:2)

不,我不会这样做。

听起来你想建模一对多关系,所以你希望使用内部DAO来获取许多对象,然后将它们映射到一个。

抵制诱惑。

您的代码告诉您原因:

  1. 外部循环带回具有一对多关系的N个对象。
  2. 内部循环为N个对象中的每个对象查询一次并恢复其依赖关系。
  3. Classic noob N + 1查询错误。对于大N来说,网络延迟会杀死你。

    正确的做法是做一个查询,一次带回所有数据并将其映射到相关对象。

    也许像Hibernate这样的ORM工具非常适合。如果你有很多1:m的关系,我敢打赌Hibernate会比生成高效的SQL做得更好或更好。