Php 原则2-使用复合密钥持久化实体

Php 原则2-使用复合密钥持久化实体,php,orm,doctrine-orm,composite,Php,Orm,Doctrine Orm,Composite,具有复合密钥的条令2实体: /** * @Entity */ class Test { /** * @Id * @Column (type="integer", length=11, name="id") * */ protected $id = null; /** * @Id * @Column (type="integer", length=11, name="idtwo") *

具有复合密钥的条令2实体:

/**
 * @Entity 
 */
class Test
{
    /**
     * @Id
     * @Column (type="integer", length=11, name="id")
     *
     */
    protected $id = null;

    /**
     * @Id
     * @Column (type="integer", length=11, name="idtwo")
     *
     */
    protected $idtwo = null; 

    public function setIdTwo($id)
    {
        $this->idtwo = $id;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

}
保存实体

$test = new Test();
$test->setId(1);
$test->setIdTwo(1);
$em->persist($test);
数据库表:

CREATE TABLE `Bella_Test` (
  `id` int(11) NOT NULL,
  `idtwo` int(11) NOT NULL,
  PRIMARY KEY (`id`,`idtwo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
预期结果:在db表中添加一行,其中包含两个id字段,两个字段的值均为1

实际结果:没有向db表添加任何行。没有抛出异常


问题:发生了什么?

您可以使用try-catch块查看发生了什么

try{
    $em->flush(); //don't forget flush after persisting an object
}
catch(Exception $e){
   echo 'Flush Operation Failed: '.$e->getMessage();   
}
其他假设,在我看来,您的实体表名和DB表名可能不匹配。我想试试也不错

/**
 * @Entity 
 * @Table(name="Bella_Test")
 */
 .
 .
 .

您是否正在调用
$em->flush()
从不喜欢使用复合PK,当然它们在理论上工作得很好,但您是否尝试过删除或更新一个?应用程序需要知道这两个值,而不是一个PK,其中应用程序只需要知道一个id。