这可能是非常简单的事情,但我是一些面向对象模式的新手。
简单地说,在另一个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;
}
注意:在用户实体中有很多类似的属性与实体本身(地址,电子邮件,电话号码等)有一对多的关系。需要的查询(使用所有链接表)将非常复杂。
谢谢,
史蒂夫
答案 0 :(得分:2)
不,我不会这样做。
听起来你想建模一对多关系,所以你希望使用内部DAO来获取许多对象,然后将它们映射到一个。
抵制诱惑。
您的代码告诉您原因:
Classic noob N + 1查询错误。对于大N来说,网络延迟会杀死你。
正确的做法是做一个查询,一次带回所有数据并将其映射到相关对象。
也许像Hibernate这样的ORM工具非常适合。如果你有很多1:m的关系,我敢打赌Hibernate会比生成高效的SQL做得更好或更好。