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 相关文章推荐
图书管理程序(三)
Oct 09 PHP
php表单转换textarea换行符的方法
Sep 10 PHP
七款最流行的PHP本地服务器分享
Feb 19 PHP
php读取大文件示例分享(文件操作类)
Apr 13 PHP
php ci框架中加载css和js文件失败的原因及解决方法
Jul 29 PHP
PHP编译安装中遇到的两个错误和解决方法
Aug 20 PHP
用PHP代码给图片加水印
Jul 01 PHP
PHP邮件群发机实现代码
Feb 16 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
Mar 01 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
php 从一个数组中随机的取出若干个不同的数实例
Dec 31 PHP
visual studio code 调试php方法(图文详解)
Sep 15 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
实用PHP会员权限控制实现原理分析
2011/05/29 PHP
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
Ajax+PHP实现的模拟进度条功能示例
2019/02/11 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
JavaScript图片轮播代码分享
2015/07/31 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
easyui combotree加载静态数据问题(选不上)解决方法
2016/12/26 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
用python爬取租房网站信息的代码
2018/12/14 Python
通过实例了解python property属性
2019/11/01 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
python和php哪个容易学
2020/06/19 Python
Python学习笔记之装饰器
2020/08/06 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
关于box-sizing的全面理解
2016/07/28 HTML / CSS
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
外语学院毕业生的自我鉴定
2013/11/28 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
见义勇为事迹材料
2014/12/24 职场文书
感恩教育观后感
2015/06/17 职场文书
安全生产培训心得体会
2016/01/18 职场文书
用Python可视化新冠疫情数据
2022/01/18 Python