时间:2021-07-01 10:21:17 帮助过:43人阅读
user和profile 一对一关系
user和book 多对多关系
book 和category 多对多关系
book和author 多对一关系
author和category 一对多关系
2.设计数据库和symfony的连接,
这一步很简单,就是改变symfony项目当中app/config/php文件之中的参数即可,改为本地mysql数据库参数
3.配置Entity,定义类
首先说一下我对这一步的理解,实质上来讲就是将数据库当中的表映射为php的类,这样子,我们来在操作数据库时,需要进行各种sql语句的书写,但是如果映射到类,各种操作就可变为
直接对一个对象进行操作,调用各种方法,doctrine会帮我们自动生成sql语句,操作数据库,这样就可极大的提高开发效率。并且在创建表时,我们也是只需要定义php的各种类,之后进行
php app/console doctrine:generate:entities 以及doctrine:schema:update 命令更新数据库,这样就会自动在数据库当中生成表。生成之前,可以用 dectrine:schema:validate检查annoatation
是否正确,以便后续更新数据库。
接下来先对deoctrine\ORM\Mapping 的一对一,一对多,多对多,加入表等模块进行学习,之后运用进行entity的配置
这里附上doctrine的官方文档之中关于working with Object
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html#
下面用代码进行简单的说明
- <span style="font-size: 18px;"><span style="color: #000000;">use Doctrine\ORM\Mapping\OneToOne;
- use Doctrine\ORM\Mapping\ManyToMany;
- use Doctrine\ORM\Mapping </span><span style="color: #0000ff;">as</span><span style="color: #000000;"> ORM;
- </span><span style="color: #008000;">//</span><span style="color: #008000;">剩下的模块导入类似,这里不再说说明</span><span style="color: #008000;">
- /*</span><span style="color: #008000;">*
- *设置生成的repository的名字,这里绝对路径,前面要用namespace
- *@ORM\Entity(repositoryClass="AuthorRepository")
- *@ORM\Table(name="author") 数据库当中表的名字
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">class</span><span style="color: #000000;"> Author{
- </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
- *@ORM\Id 说明是主键
- *@ORM\Column(type="integer") 说明字段类型
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">protected</span><span style="color: #000000;"> $id;
- </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
- *@Column(type="string") 定义普通的字段只需说明类型
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">protected</span><span style="color: #000000;"> $name;
- </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
- *@OneToMany(targetEntity="Book",mappedBy="author")
- 一对多关系,指向目标entity,mappedBy参数代表映射字段,
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">protected</span><span style="color: #000000;"> $books;
- }</span></span>
下面演示book_entity,即多对一关系和多对多关系的书写方法
- <span style="font-size: 18px;"><span style="color: #008000;">//</span><span style="color: #008000;">use 同上,省去</span><span style="color: #008000;">
- /*</span><span style="color: #008000;">*
- *@ORM\Entity(repositoyClass="BookRepository")
- *@ORM\Table(name="book") 同上
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">class</span><span style="color: #000000;"> Book{
- </span><span style="color: #008000;">//</span><span style="color: #008000;">这里不进行重复演示 </span>
- <span style="color: #008000;">/*</span><span style="color: #008000;">*
- *多对一关系,和author当中的books对应,由于多对一关系
- *所以需要在多的那个表当中添加外键,指向一表的id字段(JoinColumn)
- *@ManyToOne(targetEntity="Author",inversedBy="books")
- *@JoinColumn(name="author_id",referencedColumnName="id")
- </span><span style="color: #008000;">*/</span>
- <span style="color: #0000ff;">protected</span> <span style="color: #800080;">$author</span></span><span style="color: #000000;"><span style="font-size: 18px;">;
- /**<br> *多对多关系,category和book,JoinTable()加入一个新表进行连接,JoinColumns和inverseJoinClolumns设定新表当中的字段,也可以不设置,<br> *自动生成,这里需要注意inversedBy和mappedBy,这边用了inversedBy,与之对应的ManyToMany就需要用mappedBy,并且在inversedBy这边JoinTable,<br> *ManyToMany(targetEntity="Category",inversedBy="books")<br> *JoinTable(name="books_categories",<br> *joinColumns={<span class="hljs-doctag">@JoinColumn(name="book_id", referencedColumnName="id")}, <br> *inverseJoinColumns={<span class="hljs-doctag">@JoinColumn(name="category_id", referencedColumnName="id")}</span></span>)<br> */<br> private $categories;
- }
- class Category{<br> /**多对多关系的另一面,使用mappedBy<br> *@ManyToMany(targetEntity="Book",mappedBy="categories") <br> */<br> private $books;<br>}
- </span> </span>
这里基本说明完了三种对应关系,除此之外,由于存在一对多和多对多关系,所以有一些属性是以数组的形式存在的,这里使用ArrayCollection数组比array更高级,可以即时更新(简单理解,具体网上查)
- <span style="font-size: 18px;">use Doctrine\Common\Collections\ArrayCollection;</span>
这样就需要书写构造函数
- <span style="font-size: 18px;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> __construt(){
- </span><span style="color: #800080;">$this</span>->books = <span style="color: #0000ff;">new</span><span style="color: #000000;"> ArrayCollection();
- </span><span style="color: #008000;">//</span><span style="color: #008000;">其他数组类似</span>
- }</span>
接下来第一步构造的表关系就可以进行Entity的定义了,需要注意annoation当中的拼写细节等,可以用doctrine:schema:validate进行验证
4.生成repositoryClass很简单,只需要在entity之前加上annoation即可,这样在执行entities命令时就会自动生成repository文件,以便后续书写该Entity的其他自定义方法
5.生成数据库也很简单,doctrine:schema:update 命令(前面都要加上php app/console)
Doctrine2-完整创建数据库
标签:div mic eval The obj conf ota 演示 属性