网上搜到的解释是方便切换数据库,以及避免写sql。这两条我不是很理解,
第一条,所谓切换数据库是指类似mysql切换到sql server这样吗,可是只要表结构一样,原生sql和查询构造器也不用改啊。
第二条,避免写冗长sql,这点查询构造器也可以啊
对于查询构造器和orm的区别,我的理解是查询构造器是一个生成sql的类,而orm是一个与表映射的类,字段映射成成员变量。我又有个问题,如果有很多表,很多字段,那么orm类岂不是很冗长。望指正我的理解哪里错误。
$user = DB::table('users')->where('name','Laravel')->first();//laravel查询构造器
$posts = Post::where('id','<',3)->orderBy('id','desc')->take(1)->get();//laravel orm
你说的很对,如果表很多,有很多字段,那么ORM类就会很冗长。
ORM的本质就是将数据库表及表与表之间的关系映射到对象及对象关系上,需要注意的是,这种映射关系虽然说是双向的,但是在Object->RDB这个方向上有一些限制,这是因为RDB对于实体的描述不如Object对于实体的描述那么丰富。
关于你提到的两个理由的说明:
方便切换数据库,个人认为虽然ORM提供了这样的特性,但是不常见,因为在真实项目中切换数据库比较少见。
避免写SQL,这个是使用ORM的重要理由,因为程序员比较偷懒,不想学SQL(即使SQL很易学),而这也是ORM最初产生的重要原因。
简单回答下orm是object Relational Mapping缩写,object是对象,relational是关系,mapping是映射。对象关系映射看起来还是蛮抽象的,没错,它就是个抽象概念。从编程语法上来看,就是在具体的操作业务对象的时候,不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。
然后回答下你的两个问题
第一条,mysql和sqlserver是有很多区别的,你在程序中使用的mysql_开头的函数在sqlserver下都是识别不了的。那么你如何做到迁移而不改代码呢?
第二条,orm包含以下映射关系,不仅仅是表与类的映射。
类与数据库中表的映射:数据库中的每一张表对应编程语言中的一个类
对象与表中记录的映射:关系数据库中的一张表可能有多条记录,每条记录对应类的一个实例
类的属性与数据库中表的字段的映射:数据库中表的字段的数据类型与类中的属性的类型也是一一对应的