次のように、抽象的な (そして単純な) 例を使用して質問を説明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
は、列の有効な値ではない可能性があります。
そこで、私の質問は、ドメイン オブジェクト内の各データが DB 挿入の準備ができていることをどのように検証できるでしょうか? 私の見方では、いくつかのオプションがあります。
0
メンバー変数 ( int、''
varchar など) にデフォルト値を使用するisDirty()
と、null チェックでは不十分なため、より複雑になります。ただし、デフォルト値は問題なく挿入できるため、データを挿入できることを確認するのは簡単です。NULL
デフォルト値のままにしておくisDirty()
と、かなり簡単なままになりますが、DB 用のデータの準備が整っていることを確認するのは複雑になります。各変数を個別に検証します。これは、DO によってはすぐに見苦しくなります。
MySQL 内でデフォルト値を使用する - 私にとっては実際にはオプションではありませんが、一般的には有効なオプションです