laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析


Posted in PHP onDecember 20, 2019

本文实例讲述了laravel框架数据库操作、查询构建器、Eloquent ORM操作。分享给大家供大家参考,具体如下:

1、连接数据库

laravel连接数据库的配置文件位于config/database.php中,在其中connection字段中包含laravel所支持的数据库的配置信息,可以看到其中有主机、端口、数据库、用户名、密码等信息:

'mysql' => [
  'driver' => 'mysql',
  'host' => env('DB_HOST', 'localhost'),
  'port' => env('DB_PORT', '3306'),
  'database' => env('DB_DATABASE', 'forge'),
  'username' => env('DB_USERNAME', 'forge'),
  'password' => env('DB_PASSWORD', ''),
  'charset' => 'utf8',
  'collation' => 'utf8_unicode_ci',
  'prefix' => '',
  'strict' => false,
  'engine' => null,
],

其中都是引入env文件中的默认值,laravel目录最外层有.env文件,在其中配置对应的默认值

DB_HOST=数据库服务器地址
DB_PORT=数据库端口
DB_DATABASE=数据库名
DB_USERNAME=用户名
DB_PASSWORD=密码

2、原生SQL操作数据库

在controller中对数据库进行增删改查的操作

public static function testDB(){
  //增加一条数据
  DB::insert("insert into student(name,age) values(?,?)",['sandy',19]);
  //删除一条数据
  DB::delete('delete from student where name=?',['sandy']);
  //修改一条数据
  DB::update('update student set sex=? where name=?',['男','tory']);
  //查询数据
  $res=DB::select('select * from student');
  //进行数据库通用操作
  DB::statement('drop table users');
  //打印结果
  dd($res);
}

其中通过?占位符的方式进行了参数绑定,以此来防止数据库注入攻击,也可以通过命名绑定的方式:   

$res = DB::select('select * from users where id = :id', ['id' => 1]);

3、通过查询构建器操作数据库

Laravel将常用的数据库操作封装为接口函数提供给用户调用,从而使数据库操作更为便捷,这些接口就是查询构建器(query builder)。而且通过PDO绑定的方式避免SQL注入攻击,在使用查询构建器时不必考虑过滤用户输入。

3.1、得到结果集

lavarel查询的返回结果集合是StdClass,可以通过$res->name类似访问对象属性的方式访问返回值。如果要查询整个表使用get(),查询表中一条数据使用first(),查询一条数据的某个字段用value(),查询表中所有数据的某个字段用pluck()

//get()返回表中所有数据
$res=DB::table('student')->get();
//first()返回结果集中的第一条数据
$res=DB::table('student')->where('id','1001')->first();
//value()返回一条数据中的指定字段
$res=DB::table('student')->where('id','1003')->value('name');
//pluck()返回结果集中name字段的所有值
$res=DB::table('student')->pluck('name');

当结果集中的数据过多时,可以通过分块的方式返回结果集,chunk函数第一个参数为分块的大小(以每块2个数据的方式返回结果集),第二个参数为回调函数,当其返回false时就停止结果集的返回:

DB::table('student')->chunk(2,function ($res){
  foreach ($res as $user){
    var_dump($user);
    if ($user->id >=1003) return false;
  }
});

3.2、增删改查

//增加一条数据
DB::table('student')->insert(['name'=>'李four','sex'=>'男','age'=>22]);
//增加多条数据
DB::table('student')->insert([
  ['name'=>'wang五','sex'=>'女','age'=>21],
  ['name'=>'zhao六','sex'=>'女','age'=>20],
]);
//删除数据
DB::table('student')->where('id','>=',1006)->delete();
//删除整个表
DB::table('student')->truncate();
//修改数据
DB::table('student')->where('id',1005)->update(['sex'=>'女','age'=>21]);
//自增increment、自减decrement,默认增1
DB::table('student')->where('id',1005)->increment('age',2);
//自增同时可以进行修改
DB::table('student')->where('id',1005)->increment('age',1,['sex'=>'女']);
//查询指定字段
$res=DB::table('student')->select('name','age')->get();

3.3、查询条件

通过查询构建器的where方法可以添加数据库查询条件,where()接收三个参数:字段名、操作符、值,操作符如果是'='可以省略,例如查询id>=1003的数据:

$res=DB::table('student')->where('id','>=',1003)->get();

也可以通过条件数组传入多个限制条件,比如查询id>=1003并且id<1005:

$res=DB::table('student')->where([
  ['id','>=',1003],
  ['id','<',1005]
])->get();

通过orwhere()来连接两个并列条件,例如查询id>=1003或者id<1002的数据:

$res=DB::table('student')->where('id','>=',1003)->orwhere('id','<',1002)->get();

whereBetween()查询位于某个区间的数据:

$res=DB::table('student')->whereBetween('id',[1003,1006])->get();

when()来判断某个查询是否执行,例如当$order为true时,才会执行排序:

$order=false;
$res=DB::table('student')->when($order,function ($query){
  return $query->orderBy('age','desc');       //$order为true时才执行此语句
})->get();

3.4、排序、分组、限定

//orderBy对age字段升序
$res=DB::table('student')->orderBy('age','asc')->get();
//按照create_at字段进行时间排序
$res=DB::table('student')->latest('create_at')->get();
//分组
$res=DB::table('student')->groupBy('sex')->get();
//跳过一条数据后返回2条数据
$res=DB::table('student')->skip(1)->limit(2)->get();

3.5、聚合函数

laravel查询构建器还提供了聚合函数用于操作查询的结果集,包括count(计数)、sum(求和)、avg(平均值)、max(最大值)、min(最小值),例如求年龄平均值:

$res=DB::table('student')->avg('age');

4、Eloquent ORM

ORM是对象关系映射(Object Relational Mapping)的简称,是一种实现面向对象编程语言里不同类型系统的数据之间的转换的技术,即将数据库中的数据按照对象的形式进行组织,可以便于面向对象的程序进行数据库操作,之前在学习mongoDB时使用过mongoose ORM组织mongoDB ,当时还没有意识到这是orm。

Laravel内置的Eloquent ORM提供了一种便捷的方式帮助你组织数据库数据,每张数据表都对应一个与该表进行交互的模型(Model),通过Model类,你可以对数据表进行查询、插入、更新、删除等操作。Eloquent ORM本质上是查询构建器,因此上面查询构建器所使用的方法Eloquent都可以使用。

4.1、创建Model

在app文件夹下新建model文件,每个数据库都需要对应一个model,例如创建一个Student模板类:

namespace App;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
  //指定对应的表
  protected $table='student';
  //指定主键
  protected $primaryKey='id';
  //允许批量赋值的字段
  protected $fillable=['name','age'];
  //不允许批量赋值的字段
  protected $guarded=['created_at'];
}

模板类会默认对应小写首字母末尾加s的数据库,例如Student模板会在当前数据库中查找students表。如果需要自定义表名,则需要重写$table变量来指定表名。

Eloquent默认的主键为'id',且该字段为自增int型,如果需要自定义主键,可以通过$primaryKey来指定。

Eloquent默认会管理数据表的创建时间、更新时间,对应数据表中的created_at、updated_at字段,你需要在创建表时包含这两个字段。如果不需要管理,可以令public $timestamps = false;。否则会报错

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'updated_at' in 'field list'

也可以自定义两个时间为你数据库中的字段:

const CREATED_AT = 'my_create';
const UPDATED_AT = 'my_update';

4.2、Eloquent操作数据库

  • 新增数据有两种方法,一是通过新建ORM实例,而是通过create方法。在使用create批量添加时,需要在模板中通过$fillable指定可以赋值的字段,也可以$guard指定不允许赋值的字段。
//新建实例并赋值、保存
$stu=new Student();
$stu->name='orm2';
$stu->save();
//create方法批量添加数据
Student::create(['name'=>'orm3','age'=>13]);
  • 删除数据也有两种方法,一是通过find方法删除指定主键,二是通过查询构建器:
//destroy删除指定主键值
Student::destroy(1006,1007);
//通过查询构建器删除
Student::where('id',1008)->delete();
  • 修改数据:①通过ORM实例来修改并保存②通过查询构建器
//通过返回Student对象进行修改
$stu=Student::find(1005);
$stu->age=21;
$stu->save();
//通过查询构建器修改
Student::where('id',1005)->update(['age'=>22]);
  • 查找数据:
//查询表中所有记录
$table=Student::all();
//根据id查询一条数据
$row=Student::find(1002);
dd($table);

当然也可以通过构建器的get()、first()来获取数据

通过上面的增删改查可以看出Eloquent可以使用查询构建器的所有方法,除了增删改查外,还有where、聚合函数等。

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php后退一页表单内容保存实现方法
Jun 17 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
Apr 25 PHP
PHP计算一年多少个星期和每周的开始和结束日期
Jul 01 PHP
yii中widget的用法
Dec 03 PHP
PHP使用NuSOAP调用Web服务的方法
Jul 18 PHP
php通过会话控制实现身份验证实例
Oct 18 PHP
ThinkPHP中create()方法自动验证实例
Apr 26 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
PHP应用跨时区功能的实现方法
Mar 21 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
Oct 15 PHP
PHP与Web页面的交互示例详解二
Aug 04 PHP
PHP解决高并发问题
Apr 01 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 #PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 #PHP
Laravel框架处理用户的请求操作详解
Dec 20 #PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 #PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 #PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 #PHP
PHP中用Trait封装单例模式的实现
Dec 18 #PHP
You might like
1.PHP简介
2006/10/09 PHP
php中获得视频时间总长度的另一种方法
2011/09/15 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
php删除指定目录的方法
2015/04/03 PHP
php并发加锁示例
2016/10/17 PHP
JQuery 无废话系列教程(二) jquery实战篇上
2009/06/23 Javascript
分享20款好玩的jQuery游戏
2011/04/17 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
jQuery的animate函数学习记录
2014/08/08 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
2015/12/18 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
2018/11/05 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
python文件写入实例分析
2015/04/08 Python
python处理大数字的方法
2015/05/27 Python
python使用matplotlib绘制折线图教程
2017/02/08 Python
python爬虫之百度API调用方法
2017/06/11 Python
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
python实现微信打飞机游戏
2020/03/24 Python
解决Python中报错TypeError: must be str, not bytes问题
2020/04/07 Python
python中round函数如何使用
2020/06/19 Python
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
六道php面试题附答案
2014/06/05 面试题
创业计划书的内容步骤和要领
2014/01/04 职场文书
2014学年自我鉴定
2014/02/23 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
Mysql MVCC机制原理详解
2021/04/20 MySQL
python读取mnist数据集方法案例详解
2021/09/04 Python