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
新闻项
和类别
。此实体之间是单向关联:1NewsItem
具有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中打开tableCategory
时,那个里并没有外键。这意味着表没有链接
我做错了什么
您可以在此处查看此
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取决于情况,但在大多数情况下是的。