原作者博客:ieqi.net
====================================================================================================
模型
在MVC模式的Web框架中,模型Model作为数据的抽象而存在,在Model层中,我们放置直接对数据的各种处理和操作,然后将抽象过的数据操作暴露为Model类给控制器,这样,在控制器中我们就不必拘泥于处理具体数据现实的各种细节中了,比如数据库如何连接,数据的类型,存取方法的包装等等。开发人员只要专注于业务逻辑就可以达到操作数据的目的。
Laravel3的Model体系的设计为我们提供了极大的便利。简单的说Laravel3的数据层面的构架分为四个部分:
一是直接与数据库进行的连接相关,对于用户这个部分表现为数据库连接的配置和数据连接的指定。
二是名为Fluent的查询生成器,对于用户来说就是将调用DB下的各种方法映射为数据库SQL语句对数据库进行操作。
三是名为Eloquent的ORM工具了,为用户提供了数据的面向对象封装,也就是Laravel3中的Model类。
四是数据操作相关的支持工具,比如可以更加方便的管理数据库部署和销毁的Migrations,以及管理数据库模式的Schema Builder工具。
我们分开解说:
Laravel3与数据库
Laravel3框架默认支持如下类型数据库:
- MySQL
- PostgreSQL
- SQLite
- SQL Server
当然,必须要有更底层的相应数据库的PHP模块支持才可以在框架中使用,关于如何安装这些php数据库支持模块,这里不表。
数据库连接的配置都写在 application/config/database.php 文件中。
每种数据库有自己配置项,这个更具自身情况进行配置即可。需要注意的是,关于default字段的配置,default字段所配置的数据库连接,作为默认的数据库连接使用,即当你调用DB类的时候,不指定connect时所操作的数据库连接。
原始SQL查询与Fluent Query Builder
当建立好了书库连接,我们就可以通过DB类中的各种方法来直接操作数据库了。不过需要注意的是,直接使用查询语句或方法对数据库操作,增加了程序本身的耦合度,使得代码更不容易维护,往往我们还是讲数据映射为对象在进行处理,当然,这不能解决全部问题,在有的地方,我们还是需要使用基本的查询来进行操作。
Laravel3中使用SQL直接操作数据库很简单,即使用DB::query方法将SQL语句作为参数传入:
// 查询所有users表信息 $users = DB::query(‘select * from users‘);
在查询中绑定参数,需要在SQL语句中使用?号占位,并且按次序将参数组为数组,作为query的第二个参数传入:
// 绑定一个参数 $users = DB::query(‘select * from users where name = ?‘, array(‘test‘)); // 绑定数组 $success = DB::query(‘insert into users values (?, ?)‘, $bindings);
Laravel3还提供了一些使得query更简单的语法糖:
// 只获取查询结果第一行的内容 $user = DB::first(‘select * from users where id = 1‘); // 只获取查询结果中一列的内容 $email = DB::only(‘select email from users where id = 1‘);
希望操作其他数据库连接:
// 获得名为otherdb的数据库连接 $otherdb = DB::connection(‘otherdb‘)
接下来说一下Fluent,Fluent是Laravel3中的Query Builder,简单的说就是让开发者免于直接面对繁琐的SQL语句,而是使用更统一的过程化和面向对象化的模式来操作数据库。
首先我们可以获得一个表的对象,然后可以以此对象进行各种数据操作:
// 获取users表的操作对象 $query = DB::table(‘users‘);
获取数据
获取表中全部数据,并返回数组:
// 获取users表中全部数据 $users = DB::table(‘users‘)->get();
获取表中第一条数据:
// 获取users表中第一天数据 $user = DB::table(‘users‘)->first();
获取主键为$id的数据:
// 获取users表中id为$id的数据 $user = DB::table(‘users‘)->find($id);
限定查询条件与取回条件:
// 获取users表中id为1记录的email字段 $email = DB::table(‘users‘)->where(‘id‘, ‘=‘, 1)->only(‘email‘); // 获取users表中id与email字段 $user = DB::table(‘users‘)->get(array(‘id‘, ‘email as user_email‘)); // 获users表中非重复的数据 $user = DB::table(‘users‘)->distinct()->get();
查询条件
多条件,并列关系:
return DB::table(‘users‘) ->where(‘id‘, ‘=‘, 1) ->where(‘email‘, ‘=‘, ‘[email protected]‘) ->first();
或关系:
return DB::table(‘users‘) ->where(‘id‘, ‘=‘, 1) ->or_where(‘email‘, ‘=‘, ‘[email protected]‘) ->first();
与where方法相似的还有where_in、where_not_in、where_null、where_not_null这四个方法,对应SQL中的in、not in、is null、is not null条件:
DB::table(‘users‘)->where_in(‘id‘, array(1, 2, 3))->get(); DB::table(‘users‘)->where_not_in(‘id‘, array(1, 2, 3))->get(); DB::table(‘users‘) ->where(‘email‘, ‘=‘, ‘[email protected]‘) ->or_where_in(‘id‘, array(1, 2, 3)) ->get(); DB::table(‘users‘) ->where(‘email‘, ‘=‘, ‘[email protected]‘) ->or_where_not_in(‘id‘, array(1, 2, 3)) ->get(); return DB::table(‘users‘)->where_null(‘updated_at‘)->get(); return DB::table(‘users‘)->where_not_null(‘updated_at‘)->get(); return DB::table(‘users‘) ->where(‘email‘, ‘=‘, ‘[email protected]‘) ->or_where_null(‘updated_at‘) ->get(); return DB::table(‘users‘) ->where(‘email‘, ‘=‘, ‘[email protected]‘) ->or_where_not_null(‘updated_at‘) ->get();
对于嵌套的条件,可以通过闭包的方式来实现:
$users = DB::table(‘users‘) ->where(‘id‘, ‘=‘, 1) ->or_where(function($query) { // 这两个条件为同一级别 $query->where(‘age‘, ‘>‘, 25); $query->where(‘votes‘, ‘>‘, 100); }) ->get();
还可以通过动态反射直接调用含字段名的方法编写条件:
$user = DB::table(‘users‘)->where_email(‘[email protected]‘)->first(); $user = DB::table(‘users‘)->where_email_and_password(‘[email protected]‘, ‘secret‘); $user = DB::table(‘users‘)->where_id_or_name(1, ‘Fred‘);
关联查询
使用join做表与表之间的关联查询我们可以这样:
DB::table(‘users‘) ->join(‘phone‘, ‘users.id‘, ‘=‘, ‘phone.user_id‘) ->get(array(‘users.email‘, ‘phone.number‘));
join方法中的参数分别是表名、以及on条件的三个参数。
left join:
DB::table(‘users‘) ->left_join(‘phone‘, ‘users.id‘, ‘=‘, ‘phone.user_id‘) ->get(array(‘users.email‘, ‘phone.number‘));
如果有多个on条件,那么也可以通过闭包来表达:
DB::table(‘users‘) ->join(‘phone‘, function($join) { $join->on(‘users.id‘, ‘=‘, ‘phone.user_id‘); $join->or_on(‘users.id‘, ‘=‘, ‘phone.contact_id‘); }) ->get(array(‘users.email‘, ‘phone.number‘));
查询结构排序
使用order_by方法可以对查询结果排序,相当于SQL语句中的order by:
return DB::table(‘users‘)->order_by(‘email‘, ‘desc‘)->get();
多字段排序:
return DB::table(‘users‘) ->order_by(‘email‘, ‘desc‘) ->order_by(‘name‘, ‘asc‘) ->get();
限定与偏移
在SQL中我们可以通过Limit或者TOP控制取出数据的起点和数目,在Fluent中,我们可以这样做:
// 限定数目 return DB::table(‘users‘)->take(10)->get(); // 偏移 return DB::table(‘users‘)->skip(10)->get();
统计函数
对于SQL中的MIN, MAX, AVG, SUM, COUNT内置函数,我们可以这样在Fluent中使用:
$min = DB::table(‘users‘)->min(‘age‘); $max = DB::table(‘users‘)->max(‘weight‘); $avg = DB::table(‘users‘)->avg(‘salary‘); $sum = DB::table(‘users‘)->sum(‘votes‘); $count = DB::table(‘users‘)->count();
当然可以配合条件一起使用:
$count = DB::table(‘users‘)->where(‘id‘, ‘>‘, 10)->count();
插入数据
使用Fluent插入数据,我们可以直接将被插入的数据组织为数组,注意键值名与数据表字段名的对应:
DB::table(‘users‘)->insert(array(‘email‘ => ‘[email protected]‘));
往往我们插入一条之后,会进行接下来的操作,这时我们就需要刚才插入数据的id(当然,需要有自增主键名为id的表结构),Laravel3为我们提供这样的语法糖,非常便捷:
$id = DB::table(‘users‘)->insert_get_id(array(‘email‘ => ‘[email protected]‘)); // 可以利用$id进行其他处理
更新数据
使用update方法更新数据,传入与字段名对应的数组:
$affected = DB::table(‘users‘)->update(array(‘email‘ => ‘[email protected]‘));
结合查询条件使用:
$affected = DB::table(‘users‘) ->where(‘id‘, ‘=‘, 1) ->update(array(‘email‘ => ‘[email protected]‘));
删除数据
删除数据,使用delete方法,可以配合条件使用:
$affected = DB::table(‘users‘)->where(‘id‘, ‘=‘, 1)->delete();
可以直接通过主键id删除数据:
$affected = DB::table(‘users‘)->delete($id);
其他方法
如果需要在Fluent中,使用一些Fluent本身没有特性,比如数据库内自定义函数,那么可以使用raw方法:
DB::table(‘users‘)->update(array(‘updated_at‘ => DB::raw(‘NOW()‘))); DB::table(‘users‘)->update(array(‘votes‘ => DB::raw(‘votes + 1‘)));
对于上述的votes+1这样的操作,Fluent也提供了更加简单的方法:
// 递增 DB::table(‘users‘)->increment(‘votes‘); // 递减 DB::table(‘users‘)->decrement(‘votes‘);
laravel3学习笔记(五)