一、新建Entity并生成数据库表
首先我们新建4个Entity并生成数据库表。(在我以前的文章symfony之十分钟入门中,详细介绍了怎样新建Entity并生成数据库表)
分别是Section(版块)、Article(文章)、Tag(标签)、Photo(图片),我们用这4个Entity和表来介绍三种关联模型。
Section——Article是One To Many关联;
Article——Tag是Many To Many关联;
Article——Photo是One To One关联。
( 纯手打不容易,转载请注明出处中梦博客)
二、手动设置关联
1.Section——Article
一个版块下会有多篇文章,所以Section——Article就是一对多的关联。
我们在Section.php中增加一对多的关联栏位。
namespace ZMBBSBundleEntity;
use DoctrineORMMapping as ORM;
/**
* Section
*
* @ORMTable()
* @ORMEntity
*/
class Section
{
/**
*
* @ORMOneToMany(targetEntity="Article", mappedBy="section")
* @var Article[]
*/
protected $articles;
/**
* @var integer
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
......
这里我们加上一个articles栏位,并且指定他的对应关系是OneToMany
targetEntity->对应到哪一个Entity,这里指的是Article
mappedBy->目标Entity(Article)他的哪个栏位要对应目前的Entity(Section)
接下来修改Article.php
namespace ZMBBSBundleEntity;
use DoctrineORMMapping as ORM;
/**
* Article
*
* @ORMTable()
* @ORMEntity
*/
class Article
{
/**
* @ORMManyToOne(targetEntity="Section", inversedBy="articles")
* @ORMJoinColumn(name="section_id", referencedColumnName="id")
* @var Section
*/
protected $section;
/**
* @var integer
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
......
这里我们加上一个section栏位,并且指定他的对应关系是ManyToOne
targetEntity->对应到哪一个Entity,这里指的是Section
inversedBy->作为Section的目标Entity,被对应的栏位
JoinColumn:name->设置foreign key的栏位名section_id(Article),referencedColumnName->对应的id(Section)
2.Article——Tag
多篇文章可能对应多个标签,所以Article——Tag是多对多的关联。
修改Tag.php
namespace ZMBBSBundleEntity;
use DoctrineORMMapping as ORM;
/**
* Tag
*
* @ORMTable()
* @ORMEntity
*/
class Tag
{
/**
* @ORMManyToMany(targetEntity="Article", mappedBy="tags", cascade={"all"})
* @var Article[]
*/
protected $articles;
/**
* @var integer
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
......
这里我们加上一个articles栏位,并且指定他的对应关系是ManyToMany
targetEntity->对应到哪一个Entity,这里指的是Article
mappedBy->目标Entity(Article)的哪个栏位要对应目前的Entity(Tag)
cascade->级联的作用域为all
然后修改Article.php
<?php
namespace ZMBBSBundleEntity;
use DoctrineORMMapping as ORM;
/**
* Article
*
* @ORMTable()
* @ORMEntity
*/
class Article
{
/**
* @ORMManyToOne(targetEntity="Section", inversedBy="articles")
* @ORMJoinColumn(name="section_id", referencedColumnName="id", nullable=false)
* @var Section
*/
protected $section;
/**
* @ORMManyToMany(targetEntity="Tag", inversedBy="articles", cascade={"all"} )
* @ORMJoinTable(
* name="TagArticle",
* joinColumns={@ORMJoinColumn(name="tag_id", referencedColumnName="id")},
* inverseJoinColumns={@ORMJoinColumn(name="article_id", referencedColumnName="id")}
* )
* @var Tag[]
*/
protected $tags;
/**
* @var integer
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
......
我们加上一个tags栏位,并且指定他的对应关系是ManyToMany
JoinTable->这里我们要指明额外加入了一个中间表TagArticle
joinColumns->目标关联栏位(这里指Tag)
inverseJoinColumns->自己的关联栏位(这里指Article)
3.Article——Photo
一篇文章一个封面图片,所以Article——Photo是一对一的关联。
先修改Photo.php
namespace ZMBBSBundleEntity;
use DoctrineORMMapping as ORM;
/**
* Photo
*
* @ORMTable()
* @ORMEntity
*/
class Photo
{
/**
* @ORMOneToOne(targetEntity="Article", mappedBy="photo")
*
* @var Article
*/
protected $article;
/**
* @var integer
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
......
我们加上一个article栏位,并且指定他的对应关系是OneToOne
targetEntity->对应到哪一个Entity,这里指的是Article
mappedBy->目标Entity(Article)的哪个栏位要对应目前的Entity(Photo)
再来修改Article.php
namespace ZMBBSBundleEntity;
use DoctrineORMMapping as ORM;
/**
* Article
*
* @ORMTable()
* @ORMEntity
*/
class Article
{
/**
* @ORMOneToOne(targetEntity="Photo", inversedBy="article")
* @ORMJoinColumn(name="photo_id", referencedColumnName="id", nullable=false)
* @var Photo
*/
protected $photo;
/**
* @ORMManyToOne(targetEntity="Section", inversedBy="articles")
* @ORMJoinColumn(name="section_id", referencedColumnName="id", nullable=false)
* @var Section
*/
protected $section;
/**
* @ORMManyToMany(targetEntity="Tag", inversedBy="articles", cascade={"all"} )
* @ORMJoinTable(
* name="TagArticle",
* joinColumns={@ORMJoinColumn(name="tag_id", referencedColumnName="id")},
* inverseJoinColumns={@ORMJoinColumn(name="article_id", referencedColumnName="id")}
* )
* @var Tag[]
*/
protected $tags;
/**
* @var integer
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
......
我们加上一个photo栏位,并且指定他的对应关系是OneToOne
targetEntity->对应到哪一个Entity,这里指的是Photo
inversedBy->作为Photo的目标Entity,被对应的栏位
JoinColumn:name->设置foreign key的栏位名photo_id(Article),referencedColumnName->对应的id(Photo)
最后来重建整个Entity
doctrine:generate:entities ZMBBSBundle --no-backup
( 纯手打不容易,转载请注明出处中梦博客)
三、同步数据库
你已经离成功只有一步之遥了,最后补上一刀同步数据库。
doctrine:schema:update --force
看到下面出现
Database schema updated successfully!
大功告成!
看现在的数据库表变化,自动新建了TagArticle表,并添加了关联。