Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在另一把刀中使用一把刀-好的还是坏的做法?_Php_Database_Oop - Fatal编程技术网

Php 在另一把刀中使用一把刀-好的还是坏的做法?

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

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

简单地说,在另一个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;
}
公共函数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来获取多个对象,然后将它们映射到一

抵制这种诱惑

您的代码告诉您为什么:

  • 外部循环返回具有一对多关系的N个对象
  • 内部循环对N个对象中的每个对象查询一次,并返回其依赖项
  • 经典noob N+1查询错误。网络延迟将使您的网络寿命大大缩短

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


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

    你能解释一下为什么这样做是件坏事吗?@duffymo:我认为这是一个相当大胆的说法(双关语)。我想你不是想在所有场合都用这个吧?我的意思是,在某些情况下(对于大的一对多数据集),延迟加载可能更合适,不是吗?延迟加载是使用适当支持它的ORM工具的一个很好的理由。我不想让任何人从头开始写这样的东西。当我说“所有您的数据”时,我并不是指导致内存不足错误的数百万行。你必须对你得到的东西很精明。谷歌查询会返回数百万次点击,但一次会返回25次。写一把刀的人应该同样明智地对待他们从坚持中带来的东西和记忆。@fireeyedboy-喜欢这个双关语。我很抱歉没有在我的回复中给它应有的通知。我只需要一个查询,就可以在线路上支付更多字节的罚款,而不是网络延迟:“选择用户信息,地址信息…”。多次带回用户信息,因为它比网络延迟更好。映射它一次,然后只做地址信息。