为什么关联不是在Doctrine2中创建的?

时间:2014-05-13 20:12:42

标签: php doctrine-orm zend-framework2

我有2个实体 - NewsItemCategory。它是这些实体之间的单向关联:1 NewsItem有1 Category,1 Category有很多NewsItem

我正在尝试创建像THIS示例中的关联映射。我尝试过什么?我的代码:

class NewsItem {
    // other fields

    /**
    * @var int
    * @ORM\Column(type="integer")
    * @ORM\ManyToOne(targetEntity="News\Entity\Category")
    */
    protected $category_id;

    // other fiels, getters, setters etc
}

之后,我手动删除了数据库中的表,并在命令行中运行命令orm:schema-tool:update --force。它说一些查询没有错误地执行 - 它没问题。但是当我在HeidiSQL中打开表Category时,那里没有FOREIGN KEYS。这意味着表没有链接。

我做错了什么?

您可以在此处观看此News\Entity\NewsItem实体的完整代码:click meNews\Entity\Category实体位于此处:click me

2 个答案:

答案 0 :(得分:1)

你应该删除* @ORM\Column(type="integer"),因为它与多对一关系冲突。

即使不是错误的原因,您也应该将protected $category_id;重命名为protected $category;

此外,您的两个实体位于相同的命名空间下,因此无需添加相关实体的完整路径。 targetEntity="Category"就够了。

答案 1 :(得分:1)

您有类别实体的映射信息不正确。

您的 NewsItem.php 文件应如下所示:

namespace Your\Bundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\JoinColumn;

/**
 * @ORM\Table(name="news_item")
 * @ORM\Entity
 */
class NewsItem {
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var Category
     *
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="news_items")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    private $category;

    // Rest of code omitted.
}

您的 Category.php 应如下所示:

namespace Your\Bundle\Entity;

/**
 * @ORM\Table(name="category")
 * @ORM\Entity
 */
class Category {    
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="NewsItem", mappedBy="category")     
     */
    private $news_items;

    public function __construct(){
        $this->news_items = new ArrayCollection();
    }

    // Rest of code omitted.
}