laravel3学习笔记(五)

原作者博客: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学习笔记(五)

时间: 2024-10-13 10:00:48

laravel3学习笔记(五)的相关文章

laravel3学习笔记(十五)

原作者博客:ieqi.net ==================================================================================================== 异常与日志 在应用中,我们总会遇到各种问题.各种异常,这时,记录异常发生时的状态就很重要,所以异常与日志是有着天然的关系的. 关于异常与日志的配置在文件 application/config/error.php 中. 文件中有四个配置项: 'ignore' => ar

Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记(五)----协同IResult 今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execute after the return of a action. /// </summary> public interface IResult { /// <summary> /// Executes the result using the specif

angular学习笔记(五)-阶乘计算实例(1)

<!DOCTYPE html> <html ng-app> <head> <title>2.3.2计算阶乘实例1</title> <meta charset="utf-8"> <script src="../angular.js"></script> <script src="script.js"></script> </

NLTK学习笔记(五):分类和标注词汇

[TOC] 词性标注器 之后的很多工作都需要标注完的词汇.nltk自带英文标注器pos_tag import nltk text = nltk.word_tokenize("And now for something compleyely difference") print(text) print(nltk.pos_tag(text)) 标注语料库 表示已经标注的标识符:nltk.tag.str2tuple('word/类型') text = "The/AT grand/J

Linux System Programming 学习笔记(五) 进程管理

1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity inside of a process the virtualization of memory is associated with the process, the threads all share the same memory address space 2. pid The idle pro

java之jvm学习笔记五(实践写自己的类装载器)

java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类装载器和安全管理器是可以被动态扩展的,或者说,他们是可以由用户自己定制的,今天我们就是动手试试,怎么做这部分的实践,当然,在阅读本篇之前,至少要阅读过笔记三. 下面我们先来动态扩展一个类装载器,当然这只是一个比较小的demo,旨在让大家有个比较形象的概念. 第一步,首先定义自己的类装载器,从Clas

WEB前端学习笔记 五

接web前端学习笔记第四篇,此篇为web学习笔记 五,在此感谢您的采集和转发,但请注明文章出自网知博学. 2.0.3  html标签的属性格式 现在我们知道了两个双标签分别是,标题标签:<h1> - <h6>.和段落标签:<p></p>还知道了一个换行的单标签:<br />,现在我们给<p></p>标签添加一个属性,来改变段落是右对齐,还是左对齐,还是居中. 如上图,<p>标签中的 align(中文就是排列的意

小猪的数据结构学习笔记(五)

小猪的数据结构学习笔记(五) 线性表之--循环链表                           --转载请注明出处:coder-pig 循环链表知识点归纳: 相关代码实现: ①判断是否为空表: ②单循环链表的存储结构 其实和单链表的结构是一样的! /*定义循环链表的存储结构*/ typedef struct Cir_List { int data; struct Cir_List *next; }Lnode; ③初始化循环单链表 代码如下: //1.循环链表的初始化 //表示一个元素,如

python之list(学习笔记五)

python之list(学习笔记五) Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出公司里同事的名字,就可以用一个list表示: >>> worker = ['wtf','laotan','xiaoxian'] >>> worker ['wtf', 'laotan', 'xiaoxian'] 变量 worker 就是一个list.用 len() 函数可以获得list元素的个数: >>>