Я наконец хочу попасть в модели данных. Но есть одна вещь, которую я не могу обернуть головой, и я надеюсь, что это не будет звучать слишком глупо:
Как или когда установить идентификатор объекта?
Я имею в виду, что при создании объекта не существует способа узнать, какой идентификатор будет иметь этот объект при вставке в базу данных (классом mapper). Итак, как я могу сохранить реляционные объекты, если я еще не знаю идентификаторы?
Я попытаюсь объяснить это на примере:
class product {
private $id; // ??
private $name;
private $color;
function __construct( $name, color $color ){
$this->name = $name;
$this->color = $color;
}
function getName(){
return $this->name;
}
function getColor(){
return $this->color;
}
function setId(){
$this->id = $id;
}}
class color {
private $id; // ??
private $hexCode;
function __construct( $hexCode ){
$this->hexCode = $hexCode;
}
function getId(){
return $this->id;
}
}class productMapper{
function persist( product $product ){
// persist query
$someQueryBuilder->insert('products')->set('name',$product->getName())->set('refColor',$product->getColor()->getId());
$product->setId( $someQueryBuilder->getInsertId() );
}
}$color = new color('FFCC00');
$product = new product( 'table', $color );$productMapper = new productMapper();
$productMapper->persist( $product );
Так что моя проблема в том, что я не могу продолжать product
объект, как мой color
У объекта еще нет идентификатора.
Как правильно это сделать ??
Или мой подход здесь просто неверен?
Спасибо, что помогли мне или, возможно, просто указали мне в правильном направлении.
Добавьте первичный ключ auto_increment в таблицу продуктов в столбце id.
Как вы и планировали, вам не нужен идентификатор продукта или цвета.
Однако, если вы настаиваете на наличии идентификатора для этих классов (например, если у вас есть эти объекты также в таблицах базы данных), вы должны запланировать некоторые коды в этих классах, чтобы установить идентификатор для объектов.
class product {
private $id;
private $name;
private $color;
private static $last_id;
function __construct( $name, color $color ){
$this->last_id++;
$this->id=$this->last_id;
$this->name = $name;
$this->color = $color;
}
function getName(){
return $this->name;
}
function getColor(){
return $this->color;
}
function getId(){
return $this->id;
}
}
class color {
private $id;
private $hexCode;
private static $last_id;
function __construct( $hexCode ){
$this->last_id++;
$this->id=$this->last_id;
$this->hexCode = $hexCode;
}
function getId(){
return $this->id;
}
}class productMapper{
function persist( product $product ){
// persist query
$someQueryBuilder->insert('products')->set('name',$product->getName())->set('refColor',$product->getColor()->getId());
$product->setId( $someQueryBuilder->getInsertId() );
}
}$color = new color('FFCC00');
$product = new product( 'table', $color );$productMapper = new productMapper();
$productMapper->persist( $product );