0

这是情况............我有一个DBManager,它实现了一个DBInterface,在DBInterface中,我有4个方法:

-create(DBCmd);
-read(DBCmd);
-update(DBCmd);
-delete(DBCmd);

DBCmd 对象负责生成 SQL 语句,DBCmd 需要 sql 语句中的对象:

class DBCmd{
    public _constructor($aObj){
    }
    public executeCreate(){
    }
    public executeRead(){
    }
    public executeUpdate(){
    }
    public executeDelete(){
    }

}

流程将是这样的:

aObject ---> put it into DBCmd ----> put the DBCmd in DBManager ---> execute 

但是当我得到一些与其他表相关的对象时,就会出现问题,例如......一个客户有一个购买记录,而哪个购买记录有很多项目......

那么,我在 read 方法中做了什么?我应该阅读与客户相关的所有记录吗?我是否也需要循环购买记录中的所有项目?如果是的话,当我读客户时,我需要查询 3 个表,但有些可能不需要查看......它浪费了资源......

我想出了另一个解决方案,我制作了一组新的 DBCmd,它允许我获取相关的数据库项目,例如:

class getReleatedPurchaseRecordDBCmd{
    public _constructor($aCustomerObject){
    }
    //.... ....
}

但是在这个“解决方案”中,我遇到了一些问题,是我失去了对象客户中的关系......是的,我可以读回所有记录,获取客户对象基本上对购买记录一无所知。 ...

有些人可能会要求我做这样的事情:

class customer{
    //skip other methods...

    public getPurchaseRecords(){
       //query the db
    }

}

它可以工作,但我不希望对象结构与 db 之间有某种紧密的关系......这就是为什么我想出 DBCmd 的东西......

那么,一切似乎都很耦合,怎么解决呢?谢谢你。

4

1 回答 1

0

对于这样的东西,我倾向于使用通常涉及 sql COUNT 和 JOIN 的初始查询来获取子对象的计数,然后有一个单独的 getSubObjects 命令,如果以后需要可以调用。例如:

$datamodel->getCustomer($id);//or some such method

返回

class Customer{
   $id = 4;
   $recordCount = 5;
   $records = null;
}

然后我可以根据需要将计数用于任何显示内容,如果我需要记录填充调用:

$customer->records = $datamodel->getCustomerRecords($customer->id);
于 2011-07-29T03:54:52.980 回答