Php 为什么在Doctrine2中没有创建关联?

Php 为什么在Doctrine2中没有创建关联?,php,doctrine-orm,zend-framework2,Php,Doctrine Orm,Zend Framework2,我有两个实体-新闻项和类别。此实体之间是单向关联:1NewsItem具有1类别,1类别具有多个新闻项 我正在尝试创建如示例中所示的关联映射。我试过什么?我的代码: class NewsItem { // other fields /** * @var int * @ORM\Column(type="integer") * @ORM\ManyToOne(targetEntity="News\Entity\Category") */ prot

我有两个实体-
新闻项
类别
。此实体之间是单向关联:1
NewsItem
具有1
类别
,1
类别
具有多个
新闻项

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

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中打开table
Category
时,那个里并没有外键。这意味着表没有链接

我做错了什么


您可以在此处查看此
News\Entity\NewsItem
实体的完整代码:<代码>新闻\实体\类别实体在这里:

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

即使这不是bug的原因,也应该重命名
protected$category\u id
受保护的$category


另外,您的两个实体位于同一名称空间下,因此无需添加相关实体的完整路径
targetEntity=“Category”
就足够了

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

您的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.
}
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.
}
您的Category.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.
}
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.
}

我现在就试试。是否有方法验证模型/实体以避免此类错误?是的,您可以运行:
$php应用程序/控制台原则:schema:validate
(假设您使用的是symfony2)Hm。我使用的是zf2,我运行的命令类似于
orm:
。我知道命令
orm:validate schema
,但它说映射文件是可以的(所以它没有检测到这样的错误)。有没有什么标志可以发现这样的错误?这很有效,非常感谢!我是说你的答案。使用
@ORM\JoinColumn(nullable=false)
为什么我需要
私人$news\u项目在类别中?@SharikovVladislav如果存在,则您可以从类别实体访问NewItem-s,如果不存在,则您无法访问。我是否能够通过它?但更可取的是正确使用您的方法?@SharikovVladislav取决于情况,但在大多数情况下是的。