关系模型对象挣扎

时间:2017-04-01 13:33:55

标签: php object models relational mapper

我终于想进入数据模型。但有一件事我无法解决,我希望这听起来不会太愚蠢:

如何或何时设置对象的ID? 我的意思是,在创建对象时,无法知道此对象在插入数据库时​​将具有哪些ID(通过映射器类)。那么如果我不知道ID,我怎么能坚持关系对象?

我将尝试通过一个例子解释这个:

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对象还没有ID。 这样做的正确方法是什么? 或者我的方法在这里完全错了?

感谢您帮助我,或者只是指出我正确的方向。

2 个答案:

答案 0 :(得分:0)

在id列的product表中添加auto_increment主键。

答案 1 :(得分:0)

按照您的计划,您不需要产品或颜色的ID。

但是,如果您坚持为这些类提供Id(例如,如果您在数据库表中也有这些对象),则必须在这些类中规划一些代码以设置对象的Id。

def userlang(self):
    return (self.user.userprofile.language)

class 123(models.Model
    language = models.CharField(verbose_name=_(u"Language"), 
               max_length=4, choices=settings.LANGUAGES,default=userlang)