Php 在另一把刀中使用一把刀-好的还是坏的做法?
这可能是非常琐碎的事情,但我是一些面向对象模式的新手 简单地说,在另一个DAO中使用来自一个DAO的方法是一种不好的做法吗?我试图在DAO中创建一个实体,但发现仅使用该DAO很难创建该实体。那么,在其他DAO中使用其他DAO方法可以吗 例如:Php 在另一把刀中使用一把刀-好的还是坏的做法?,php,database,oop,Php,Database,Oop,这可能是非常琐碎的事情,但我是一些面向对象模式的新手 简单地说,在另一个DAO中使用来自一个DAO的方法是一种不好的做法吗?我试图在DAO中创建一个实体,但发现仅使用该DAO很难创建该实体。那么,在其他DAO中使用其他DAO方法可以吗 例如: public function readAllUsers() { $sql = "SELECT * FROM user"; return $this->execute($sql); } public function execute
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;
}
公共函数readAllUsers(){
$sql=“从用户选择*”;
返回$this->execute($sql);
}
公共函数执行($sql){
$result=mysql\u查询($sql,$this->getDBConnection())
或者死(mysql_error());
$user=array();
如果(mysql_num_rows($result)>0){
对于($i=0;$isetUsername(第[“userName”行]);
…设置用户信息。。。
$user[$i]->setAddresses($addressDAO->readAddressByUserId($userId));
}
}
返回$user;
}
注意:在用户实体中有很多这样的属性,它们与实体本身有一对多的关系(地址、电子邮件、电话号码等)。所需的查询(使用所有链接表)将非常复杂
谢谢
史蒂夫不,我根本不会那样做 听起来你想建立一个一对多的关系模型,所以你的希望是使用内部DAO来获取多个对象,然后将它们映射到一 抵制这种诱惑 您的代码告诉您为什么:
也许像Hibernate这样的ORM工具会很适合。如果您有很多1:m关系,我敢打赌Hibernate在生成高效SQL方面会比您做得更好 你能解释一下为什么这样做是件坏事吗?@duffymo:我认为这是一个相当大胆的说法(双关语)。我想你不是想在所有场合都用这个吧?我的意思是,在某些情况下(对于大的一对多数据集),延迟加载可能更合适,不是吗?延迟加载是使用适当支持它的ORM工具的一个很好的理由。我不想让任何人从头开始写这样的东西。当我说“所有您的数据”时,我并不是指导致内存不足错误的数百万行。你必须对你得到的东西很精明。谷歌查询会返回数百万次点击,但一次会返回25次。写一把刀的人应该同样明智地对待他们从坚持中带来的东西和记忆。@fireeyedboy-喜欢这个双关语。我很抱歉没有在我的回复中给它应有的通知。我只需要一个查询,就可以在线路上支付更多字节的罚款,而不是网络延迟:“选择用户信息,地址信息…”。多次带回用户信息,因为它比网络延迟更好。映射它一次,然后只做地址信息。