【问题标题】:Symfony2 : Entities not created in databaseSymfony2:未在数据库中创建的实体
【发布时间】:2017-06-06 17:28:48
【问题描述】:

我正在使用 Symfony2 和 Doctrine2 制作实体。我制作了一些实体来表示我的两个实体之间的多对多关系。

这些实体之一的示例:

/**
 * @ORM\Entity
 */
class Contact_Conference_Invitation
{
    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Aurae\UserBundle\Entity\Contact")
     */
    private $contact;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Aurae\ConferenceBundle\Entity\Conference")
     */
    private $conference;

    /**
     * @var datetime dateInvitation
     *
     * @ORM\Column(name="dateInvitation", type="datetime")
     */
    private $dateInvitation;

    //Getters and setters
}

我已尝试更新我的 sql 架构,但没有出现与这些实体对应的表。有没有我必须声明它们的地方(配置或类似的)?如果不是,有什么问题?

非常感谢

编辑:我忘记了这些类的名称空间,这就是 Doctrine 省略它们的原因。另一个案例已关闭:) 感谢您的回答!

【问题讨论】:

  • use Doctrine\ORM\Mapping as ORM;有没有映射类作为use语句
  • 是的,我有...我是否也必须使用我链接的两个类?
  • 不,你没有。您的多对一声明中似乎没有任何 inversedBy="x" 语句。不确定这会解决它,但它绝对是一个很好的做法。
  • 我猜还有一些加入列语句:@ORM\JoinColumn(name="conference_id", referencedColumnName="id", onDelete="SET NULL", nullable=true)
  • 好的,谢谢,我试试看。

标签: php symfony doctrine-orm


【解决方案1】:

假设 ...

不,您不需要在实体目录之外的任何地方声明它们。

  • 您收到的错误信息是什么?

  • 我猜你加了

    使用 Doctrine\ORM\Mapping 作为 ORM;

在你的类的顶部,让它们被映射。

我试过了……

我尝试通过添加一个简单的联系人和会议实体来生成您的实体,它工作正常。 这是sn-ps的代码:

Contact_Conference_Invitation.php

namespace Ahsio\StackBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Contact_Conference_Invitation
{
    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Ahsio\StackBundle\Entity\Contact")
     */
    private $contact;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Ahsio\StackBundle\Entity\Conference")
     */
    private $conference;

    /**
     * @var datetime dateInvitation
     *
     * @ORM\Column(name="dateInvitation", type="datetime")
     */
    private $dateInvitation;

    //Getters and setters
}

Contact.php

namespace Ahsio\StackBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Contact
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @param $id
     */    
    public  function setId($id)
    {
        $this->id = $id;
    }

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }
}

Conference.php

namespace Ahsio\StackBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Conference
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @param $id
     */
    public  function setId($id)
    {
        $this->id = $id;
    }

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }
}

这里是生成的表格:

注意:我为实体生成使用了一个特定的命名空间来正常工作,您需要更改它们。

【讨论】:

    【解决方案2】:

    我在您提供的代码示例中没有看到您的 ManyToMany 关系的定义。

    例如,这是我为一个项目实现的多对多关系

    Entity Project.php

    /**
     * @var Provider[]
     *
     * @ORM\ManyToMany(targetEntity="Provider", mappedBy="projects")
     */
    protected $providers = null;
    

    Entity Provider.php

    /**
     * @var Project[]
     *
     * @ORM\ManyToMany(targetEntity="Project", inversedBy="providers")
     * @ORM\JoinTable(name="PROVIDER_PROJECT")
     */
    protected $projects = null;
    

    如您所见,您在此处为多对多关系定义连接表。

    当然,这些实体是特定于我的特定项目的,但你明白了,你可以根据自己的需要轻松调整它。

    【讨论】:

    • OP 的帖子在他的多对多表中使用了一个额外的字段,所以他不能这样做,他的帖子是他实际的多对多表
    【解决方案3】:

    另外不要忘记检查您是否启用了自动映射。

    在你的 config.yml 你应该有

    doctrine:
        orm:
            auto_mapping: true
    

    遇到这个问题是因为我的实体也没有生成,这是我的问题,它可以为遇到同样问题的人节省一些时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2012-10-07
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      相关资源
      最近更新 更多