# Doctrine
几乎可以这么说,所有的Web应用都不可避免地要和数据库打交道。
在“上古时代”,我们习惯于用`mysql_connect()`这样的语句来连接数据库,`mysql_fetch_array()`这样的语句来获得数据。但是这些已经是过时的、不再推荐反而要被禁止的做法。即使我们不使用任何框架而编写一些快速的测试代码,我们也应该避免使用这些语句,而至少使用[PDO](http://php.net/manual/zh/book.pdo.php)或者[MySQLi](http://php.net/manual/zh/book.mysqli.php)中提供的API。
但是在这一层次之上,我们还有所谓的ORM (Object-relational mapping,对象-关系映射)。
什么是ORM?简单的说,操作数据库的一个最直截了当的方式,是直接使用类似`select * from a_table`这样的语句来选择数据,用`update a_table set field1=value1, field2=value2 where...`这样的语句来更新数据……
这样做当然也行。但是有很多问题:
1. 不安全。SQL注入最容易发生在这种类型的语句中。
2. 麻烦。每次都要从数据库中获取一堆数据,然后根据用途分配给不同的变量。反过来也是一样,要根据不同的变量(可能是通过计算,或者是用户通过表单提交)来构造一个SQL语句从而使得数据、信息得到存续(persistent)。
鉴于此,ORM的目的就是能让我们用处理对象的方式来处理表中的数据。创建一个对象,用`$obj->setField1()`的方式来为对象的属性赋值,然后用类似`$obj->save()`这样的方式保存这个对象到数据库中[1](https://taylorr.gitbooks.io/building-a-web-site-with-symfony/content/02.02%20doctrine.html#fn_1),对象的属性映射到表格的字段。
在获取数据时,返回的记录也能自动映射到一个对象(或者对象数组),于是我们就可以用类似`$obj->getField1()`的方式来获得记录的字段值。
+
这是非常直观、非常高效、同时也非常安全的做法。
Symfony 2中使用的ORM是[Doctrine](http://www.doctrine-project.org/)。对这个ORM的详细解说已经超出了本书的范围。我们在后面的章节中会结合实际使用介绍在SF中使用Doctrine的方法。
Doctrine是SF中缺省使用的ORM。在我们[创建一个新的SF应用](https://taylorr.gitbooks.io/building-a-web-site-with-symfony/content/05%20app%20creation.md)时,Doctrine是缺省安装的。
由于本应用已经开发到了6.0版本,笔者对应用结构也有了全新的布局,所以在该版本的应用中,M模块其实已经不再存在,而改用RESTful API调用的方式。所以本教程中对Doctrine的描述近乎为0——因为几乎没有用到[2](https://taylorr.gitbooks.io/building-a-web-site-with-symfony/content/02.02%20doctrine.html#fn_2)!即便是在API接口的开发中,我们也没有用到Doctrine(因为Silex并不支持ORM)而用了更低层的DBAL(DataBase Abstraction Layer)操作。
注意:在任何情形下都不推荐使用`mysql_connect`等已经过时并马上要被淘汰、而且极不安全的语句!
> 1. SF中使用的Doctrine在保存对象时不是用的这样的语法,但是这不妨碍我们的理解。[ ↩](https://taylorr.gitbooks.io/building-a-web-site-with-symfony/content/02.02%20doctrine.html#reffn_1 "Jump back to footnote [1] in the text.")
> 2. 在[建立数据库实体](https://taylorr.gitbooks.io/building-a-web-site-with-symfony/content/05.04%20entity.html)和[样本数据](https://taylorr.gitbooks.io/building-a-web-site-with-symfony/content/05.05%20fixture.html)这两节中,我们还会用到Doctrine来为我们目前这个还没有任何数据的数据库填充样本数据。但是,从严格意义上说,这不是应用编程本身的一部分,因为样本数据只有在测试的时候才会用到。[ ↩](https://taylorr.gitbooks.io/building-a-web-site-with-symfony/content/02.02%20doctrine.html#reffn_2 "Jump back to footnote [2] in the text.")
- 引言
- 1 LAMP
- 1.1 安装虚拟机
- 1.2 安装Vagrant
- 1.3 安装Ubuntu
- 1.4 安装Apache 2
- 1.5 安装PHP
- 1.6 安装MySQL服务器
- 1.7 最后的微调
- 1.8 设置一个虚拟主机
- 1.9 一个趁手的IDE
- 2 Symfony 3和重要构件
- 2.1 Symfony 3
- 2.2 Doctrine
- 2.3 Twig
- 2.4 Composer
- 3 Symfony重要概念
- 3.1 MVC
- 3.2 Bundle/包
- 3.3 Route/路由
- 3.4 Controller/控制器
- 3.5 Entity/实体
- 3.6 Repository/仓库
- 3.7 Template/模板
- 3.8 Test/测试
- 4 藏书管理程序的结构
- 5 创建应用
- 5.1 建立版本管理
- 5.2 建立数据库
- 5.3 应用结构
- 5.4 建立数据库实体
- 5.5 样本数据
- 5.6 路由
- 5.7 模板
- 5.8 开始编写首页
- 5.9 书籍详情页面
- 5.10 书籍列表页面
- 5.11 书籍搜索
- 6 用户和后台
- 7 结语