doctrine2 mysql_Doctrine2-完整创建数据库

---恢复内容开始---

下面用Doctrine2设置配置一个数据库,具体分为以下步骤

1.设计主要字段和表

2.配置symfony2和数据库的连接

3.配置Entity,定义类

4.实现get/set/Reposistory

5.生成数据库

先记录一个坑

这里在配置entity时,执行命令php app/console generate:doctrine:entities ScourgenWebBundle会有错误产生

[Doctrine\Common\Annotations\AnnotationException]

[Semantical Error] The annotation "@Doctrine\ORM\Mapping\GenerateValue" in property Scourgen\WebBundle\Entity\user:

:$id does not exist, or could not be auto-loaded.

可以经过检查明明是,$id明明定义了,查阅各种资料无果,最后尝试将protect $id放在ID的annoation之前,就成功了,不太明白原理,反正是个坑吧,

网上目前也没有搜索到解决方法。但是这样子就可以了,希望遇到同样问题的朋友可以这样子解决,欢迎讨论其中原理。这样子不行,之后还是会有错误,,,,,等我再搜索搜索

.............原来是一个简单的地方拼写错误导致无法识别,佛了!!!!!!!!!!!!!!之前成功是因为跳过了id字段,

a3b60bb56352838586fec57b563e42b8.png

1.第一步,设计主要字段和表,如图

昨天晚上写完忘记保存了,,,,,,,这里简单来说一下表之间的关系吧

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

下面用代码进行简单的说明

use Doctrine\ORM\Mapping\OneToOne;

use Doctrine\ORM\Mapping\ManyToMany;

use Doctrine\ORM\MappingasORM;//剩下的模块导入类似,这里不再说说明/**

*设置生成的repository的名字,这里绝对路径,前面要用namespace

*@ORM\Entity(repositoryClass="AuthorRepository")

*@ORM\Table(name="author") 数据库当中表的名字*/

classAuthor{/**

*@ORM\Id 说明是主键

*@ORM\Column(type="integer") 说明字段类型*/

protected$id;/**

*@Column(type="string") 定义普通的字段只需说明类型*/

protected$name;/**

*@OneToMany(targetEntity="Book",mappedBy="author")

一对多关系,指向目标entity,mappedBy参数代表映射字段,*/

protected$books;

}

下面演示book_entity,即多对一关系和多对多关系的书写方法

//use 同上,省去/**

*@ORM\Entity(repositoyClass="BookRepository")

*@ORM\Table(name="book") 同上*/

classBook{//这里不进行重复演示

/**

*多对一关系,和author当中的books对应,由于多对一关系

*所以需要在多的那个表当中添加外键,指向一表的id字段(JoinColumn)

*@ManyToOne(targetEntity="Author",inversedBy="books")

*@JoinColumn(name="author_id",referencedColumnName="id")*/

protected $author;

/**

*多对多关系,category和book,JoinTable()加入一个新表进行连接,JoinColumns和inverseJoinClolumns设定新表当中的字段,也可以不设置,

*自动生成,这里需要注意inversedBy和mappedBy,这边用了inversedBy,与之对应的ManyToMany就需要用mappedBy,并且在inversedBy这边JoinTable,

*ManyToMany(targetEntity="Category",inversedBy="books")

*JoinTable(name="books_categories",

*joinColumns={@JoinColumn(name="book_id", referencedColumnName="id")},

*inverseJoinColumns={@JoinColumn(name="category_id", referencedColumnName="id")})

*/

private $categories;

}

class Category{

/**多对多关系的另一面,使用mappedBy

*@ManyToMany(targetEntity="Book",mappedBy="categories")

*/

private $books;

}

这里基本说明完了三种对应关系,除此之外,由于存在一对多和多对多关系,所以有一些属性是以数组的形式存在的,这里使用ArrayCollection数组比array更高级,可以即时更新(简单理解,具体网上查)

use Doctrine\Common\Collections\ArrayCollection;

这样就需要书写构造函数

public function__construt(){$this->books = newArrayCollection();//其他数组类似

}

接下来第一步构造的表关系就可以进行Entity的定义了,需要注意annoation当中的拼写细节等,可以用doctrine:schema:validate进行验证

4.生成repositoryClass很简单,只需要在entity之前加上annoation即可,这样在执行entities命令时就会自动生成repository文件,以便后续书写该Entity的其他自定义方法

5.生成数据库也很简单,doctrine:schema:update   命令(前面都要加上php app/console)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值