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 相关文章推荐
什么是MVC,好东西啊
May 03 PHP
学习php过程中的一些注意点的总结
Oct 25 PHP
PHP Curl出现403错误的解决办法
May 29 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
Nov 25 PHP
PHP在线调试执行的实现方法(附demo源码)
Apr 28 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
Oct 11 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
PHP开发实现微信退款功能示例
Nov 25 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
Smarty缓存机制实例详解【三种缓存方式】
Jul 20 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
Oct 08 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
PHP callback函数使用方法和注意事项
2015/01/23 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
js取得html iframe中的元素和变量值
2014/06/30 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
js的三种继承方式详解
2017/01/21 Javascript
详解angularjs结合pagination插件实现分页功能
2017/02/10 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
2019/09/25 Javascript
Python实现ssh批量登录并执行命令
2016/10/25 Python
python利用sklearn包编写决策树源代码
2017/12/21 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
Python-接口开发入门解析
2019/08/01 Python
Python之Class&amp;Object用法详解
2019/12/25 Python
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
主题实践活动总结
2014/05/08 职场文书
求职信标题怎么写
2014/05/26 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
助学金感谢信
2015/01/20 职场文书
地心历险记观后感
2015/06/15 职场文书
任命书格式模板
2015/09/22 职场文书
教你使用Python pypinyin库实现汉字转拼音
2021/05/27 Python
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js