Реляционная модель Объектная борьба

Я наконец хочу попасть в модели данных. Но есть одна вещь, которую я не могу обернуть головой, и я надеюсь, что это не будет звучать слишком глупо:

Как или когда установить идентификатор объекта?
Я имею в виду, что при создании объекта не существует способа узнать, какой идентификатор будет иметь этот объект при вставке в базу данных (классом 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 У объекта еще нет идентификатора.
Как правильно это сделать ??
Или мой подход здесь просто неверен?

Спасибо, что помогли мне или, возможно, просто указали мне в правильном направлении.

0

Решение

Добавьте первичный ключ auto_increment в таблицу продуктов в столбце id.

0

Другие решения

Как вы и планировали, вам не нужен идентификатор продукта или цвета.

Однако, если вы настаиваете на наличии идентификатора для этих классов (например, если у вас есть эти объекты также в таблицах базы данных), вы должны запланировать некоторые коды в этих классах, чтобы установить идентификатор для объектов.

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 );
0

По вопросам рекламы [email protected]