[symfony2中文手册]Symfony2利用Doctrine ORM设置表关联模型的例子

更新时间:2020-09-30    来源:Symfony    手机版     字体:

【www.bbyears.com--Symfony】

一、新建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 ZM\BBSBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * Section
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Section
{
    /**
     *
     * @ORM\OneToMany(targetEntity="Article", mappedBy="section")
     * @var Article[]
     */
    protected $articles;
 
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
......
这里我们加上一个articles栏位,并且指定他的对应关系是OneToMany
targetEntity->对应到哪一个Entity,这里指的是Article
mappedBy->目标Entity(Article)他的哪个栏位要对应目前的Entity(Section)

接下来修改Article.php

 
namespace ZM\BBSBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * Article
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Article
{
    /**
     * @ORM\ManyToOne(targetEntity="Section", inversedBy="articles")
     * @ORM\JoinColumn(name="section_id", referencedColumnName="id")
     * @var Section
     */
    protected $section;
 
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(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 ZM\BBSBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * Tag
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Tag
{
    /**
     * @ORM\ManyToMany(targetEntity="Article", mappedBy="tags", cascade={"all"})
     * @var Article[]
     */
    protected $articles;
 
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
......
这里我们加上一个articles栏位,并且指定他的对应关系是ManyToMany
targetEntity->对应到哪一个Entity,这里指的是Article
mappedBy->目标Entity(Article)的哪个栏位要对应目前的Entity(Tag)
cascade->级联的作用域为all

然后修改Article.php

<?php
 
namespace ZM\BBSBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * Article
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Article
{
    /**
     * @ORM\ManyToOne(targetEntity="Section", inversedBy="articles")
     * @ORM\JoinColumn(name="section_id", referencedColumnName="id", nullable=false)
     * @var Section
     */
    protected $section;
 
    /**
     * @ORM\ManyToMany(targetEntity="Tag", inversedBy="articles", cascade={"all"} )
     * @ORM\JoinTable(
     *     name="TagArticle",
     *     joinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="article_id", referencedColumnName="id")}
     * )
     * @var Tag[]
     */
    protected $tags;
 
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
......
我们加上一个tags栏位,并且指定他的对应关系是ManyToMany
JoinTable->这里我们要指明额外加入了一个中间表TagArticle
joinColumns->目标关联栏位(这里指Tag)
inverseJoinColumns->自己的关联栏位(这里指Article)

3.Article——Photo

一篇文章一个封面图片,所以Article——Photo是一对一的关联。

先修改Photo.php

 
namespace ZM\BBSBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * Photo
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Photo
{
    /**
     * @ORM\OneToOne(targetEntity="Article", mappedBy="photo")
     *
     * @var Article
     */
    protected $article;
 
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
......

我们加上一个article栏位,并且指定他的对应关系是OneToOne
targetEntity->对应到哪一个Entity,这里指的是Article
mappedBy->目标Entity(Article)的哪个栏位要对应目前的Entity(Photo)

再来修改Article.php

 
namespace ZM\BBSBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * Article
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Article
{
    /**
     * @ORM\OneToOne(targetEntity="Photo", inversedBy="article")
     * @ORM\JoinColumn(name="photo_id", referencedColumnName="id", nullable=false)
     * @var Photo
     */
    protected $photo;
 
    /**
     * @ORM\ManyToOne(targetEntity="Section", inversedBy="articles")
     * @ORM\JoinColumn(name="section_id", referencedColumnName="id", nullable=false)
     * @var Section
     */
    protected $section;
 
    /**
     * @ORM\ManyToMany(targetEntity="Tag", inversedBy="articles", cascade={"all"} )
     * @ORM\JoinTable(
     *     name="TagArticle",
     *     joinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="article_id", referencedColumnName="id")}
     * )
     * @var Tag[]
     */
    protected $tags;
 
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(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表,并添加了关联。

本文来源:http://www.bbyears.com/jiaocheng/101821.html