我将使用一个抽象(简单)的示例来说明问题:CarDomainObject
,如下:(示例mysql数据类型列在成员旁边)
class carDomainObject extends DomainObjectAbstract {
public $uid; //int
public $make; //varchar
public $model; //varchar
public $productionDate; //timestamp
public $doors; //tinyint
}
class DomainObjectAbstract {
public function setData(array $data=array())
{
foreach ($data as $key => $value)
{
if ( ! empty($key))
{
$this->$key = $value;
}
}
}
//if $val is not passed, checks for ANY set value,
// else checks that $this->$val is set (dirty)
public function isDirty($val=false)
{
foreach(get_object_vars($this) as $key => $property)
{
if( ! is_null($property) && ( ! $val || $key == $val))
{
return true;
}
}
return false;
}
}
假设我们要在数据库中插入一辆新车,所以我们设置一些值:
$carDomainObject->setData(array('make' => 'ford', 'model' => 'taurus'));
现在未设置的值仍然是NULL
,这对于该isDirty()
方法很有效。此模式不适用于将对象(已像上面那样初始化,只有某些值)插入数据库时,其中NULL
可能不是列的有效值。
所以,我的问题是:我们如何验证域对象中的每个数据片段是否已准备好插入数据库?我看到它的方式有几个选项:
如果我们对成员变量使用默认值(
0
对于 int、''
对于 varchar 等),那么isDirty()
会变得更加复杂,因为空值检查是不够的。但是,检查是否能够插入数据变得微不足道,因为可以毫无问题地插入默认值如果我们坚持使用
NULL
默认值,那么isDirty()
保持相当简单,但确保数据为数据库做好准备变得复杂。单独验证每个变量,这取决于 DO 会很快变得丑陋。
在 MySQL 中使用默认值 - 对我来说不是一个真正的选项,但通常是一个有效的选项