一、新建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表,并添加了关联。
火柴人绳索英雄2无限金币版 (Stickman Rope Hero 2)安卓版v2.2v3.4.2
下载奥特曼之格斗超人内测版本 安卓最新版v11.0.0
下载奥特曼之格斗超人百度版 安卓版v11.0.0
下载奥特曼之格斗超人4399游戏盒版 最新安卓版v11.0.0
下载德凯奥特曼D闪光剑模拟器 安卓版v1.0
德凯奥特曼D闪光剑模拟器是一个非常有趣的奥特曼变身模拟器,可
亚刻觉醒器 安卓版v1.1
亚刻觉醒器模拟器是一个非常有趣的奥特曼变身模拟器,为喜欢亚刻
海上餐厅无限金币版 v1.0
海上餐厅免广告版是游戏的破解版本,在该版本中为玩家去除了广告
阿西美女室友竟然全解锁版 v1.0.2
阿西美女室友竟然内置菜单版是游戏的破解版本,在该版本中为玩家
我是大东家正版 最新版v1.2.738
我是大东家正版是一款放置类模拟经营手游,玩家将回到古代成为家