Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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中带外键的ORM设计_Php_Mysql_Oop - Fatal编程技术网

PHP中带外键的ORM设计

PHP中带外键的ORM设计,php,mysql,oop,Php,Mysql,Oop,我是PHP中OOP的新手,所以我有一个“基本”问题。 我有两个业务类,叫做“客户”和“订单” class Customer //corresponding to MySQL table 'customers' protected $customerNo; protected $customerName; //remaining customer details...... class Orders //corresponding to MYSQL table 'order

我是PHP中OOP的新手,所以我有一个“基本”问题。 我有两个业务类,叫做“客户”和“订单”

class Customer    //corresponding to MySQL table 'customers'
protected $customerNo;
protected $customerName;
//remaining customer details......

class Orders         //corresponding to MYSQL table 'orders'
protected $orderNo;
protected $customerNo;   //foreign key from above class/table 
//remaining order details.....
Orders类在实例化customer对象时是否应该加载该对象,以便执行以下操作

$objOrder = new Orders($orderNo);
$objOrder->objCustomer->someCustomerClassMethod();

基本上,如果一个表有一个或多个外键,这些外键基本上“指向”另一个业务类对象,那么这些(与外键相关的)对象是否应该与所讨论的对象一起实例化?

我不会使用构造函数来实现这一点,因为它是错误的和不清楚的

businees类中的构造函数意味着创建新的业务对象。从技术上讲,您可以在这里创建一个PHP对象,但从逻辑上讲,您应该考虑业务级别。在业务级别上,您要执行的操作是一个简单的查询,目的是获取具有特定特征(在本例中,是具有指定ID)的业务对象

因此,不是:

$objOrder=新订单($orderNo)

我只想:

$objOrder=Orders::get($orderNo)

get是Orders类中的一个静态方法,是一种服务,从逻辑上讲,它是满足您需求的清晰自然的解决方案。其定义如下:

class Orders {
    public static function get(id) {
       // use this id to retrieve the corresponding object - order

       return order;    
    }

    // other stuff here
}

仅当您确实想要创建新业务对象时才使用构造函数(例如,要连接到DB,请创建新实例)。

没有好的做法是在订单中只包含客户id。只要反映现实就行了。我想说另一种方式更有意义,即客户有订单。订单没有客户。至于实例化另一个内部的对象,则有争议。你可能会发现这段关于依赖注入的视频是一块很好的手表,