我的数据库中有一些带有复合键的表格,请参见下图:
正如您在本案中所看到的那样interest
和klists
他们拥有id
,但也有kuser
。 Doctrine docs说它们几乎支持复合键中的每个用例,但是每个具有复合键的实体都不能使用除“ASSIGNED”之外的id生成器。这意味着在调用EntityManager#persist($ entity)之前,ID字段必须设置其值。当我尝试定义与这些表相关的任何实体时,我收到了一个错误,因为Doctrine不允许这样做:
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity="UserBundle\Entity\User", inversedBy="users" )
* @ORM\JoinColumn(name="kuser", referencedColumnName="id")
*/
protected $kuser;
我知道我可以使用生命周期回调运行一些代码,但不知道我在哪里或哪里需要一些帮助,任何人都可以告诉我或指出我在正确的道路上?
答案 0 :(得分:2)
回到基础。我建议从这里开始:http://docs.doctrine-project.org/en/latest/reference/association-mapping.html
class KUser
{
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
class Interest
{
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="UserBundle\Entity\KUser")
* @ORM\JoinColumn(name="kuser_id", referencedColumnName="id")
*/
protected $kuser;
这就是在Interest和KUser之间建立单向ManyToOne
关系所需的一切。如果您需要双向,那么将$interests
属性添加到KUser并在Interest.kuser中设置inversedBy
确保在继续之前了解简单的关系。
如果链接表没有其他属性,则Doctrine将自动生成ManyToMany
链接表。您的KUserHasKLists确实有其他属性。因此,您需要将其设为实体,然后使用ManyToOne
关系链接其他表。虽然从技术上讲你可能仍然在这里使用复合键,但定义一个自动增量主键要容易得多。
class KUserHasKLists
{
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="UserBundle\Entity\KUser")
* @ORM\JoinColumn(name="kuser_id", referencedColumnName="id")
*/
protected $kuser;
/**
* @ORM\ManyToOne(targetEntity="UserBundle\Entity\KList")
* @ORM\JoinColumn(name="klist_id", referencedColumnName="id")
*/
protected $klist;
但是,再次,从一个简单的关系开始,并确保你了解发生了什么。如果你对phpunit感到满意,可以自己做一些功能测试。如果没有,请自己制作一个Symfony Command,以便从命令行中试验这些东西。