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(3)
Oct 09 PHP
PHP 模板高级篇总结
Dec 21 PHP
PHP 程序员也要学会使用“异常”
Jun 16 PHP
PHP中利用substr_replace将指定两位置之间的字符替换为*号
Jan 27 PHP
php json_encode奇怪问题说明
Sep 27 PHP
php addslashes及其他清除空格的方法是不安全的
Jan 25 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
Oct 08 PHP
改写ThinkPHP的U方法使其路由下分页正常
Jul 02 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
ThinkPHP框架里隐藏index.php
Apr 12 PHP
PHP面向对象中new self()与 new static()的区别浅析
Aug 17 PHP
PhpStorm+xdebug+postman调试技巧分享
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的无限分类实现想法~
2007/01/02 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
在次封装easyui-Dialog插件实现代码
2010/11/14 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
js实现微信分享代码
2020/10/11 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
用nodejs搭建websocket服务器
2017/01/23 NodeJs
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
Vue中div contenteditable 的光标定位方法
2018/08/25 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
Python实现将文本生成二维码的方法示例
2017/07/18 Python
Python玩转Excel的读写改实例
2019/02/22 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
python点击鼠标获取坐标(Graphics)
2019/08/10 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
基于jupyter代码无法在pycharm中运行的解决方法
2020/04/21 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
德国咖啡批发商:Coffeefair
2019/08/26 全球购物
人事部专员岗位职责
2014/03/04 职场文书
环保宣传标语
2014/06/12 职场文书
暑期培训心得体会
2014/09/02 职场文书
政府四风问题整改措施
2014/10/04 职场文书
运动与健康自我评价
2015/03/09 职场文书
办公室日常管理制度
2015/08/04 职场文书
生日宴会祝酒词
2015/08/10 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技