> php教程 > php >

laravel数据库常用操作

来源:网络 文章列表 2022-02-07 8
laravel数据库常用方法

使用 DB facade 实现 CURD;

也叫做原始查表。就是用最原始的 SQL 语句操作数据库

# 之前创建了一张 student 表,所以创建一个 student 的控制器
# 新建 App/Http/Controllers/StudentController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;	 // 加载的类库

class StudentController extends Controller{
    
    public function test1(){
        // return 'test1';
        // 查询
        $sutdent = DB::select('SELECT * FROM student WHERE id > ?', [1000]);
        dd($sutdent);
		
		// 新增
		$bool = DB::insert('INSERT INTO student(name, age) VALUES (?, ?)', ['Tom', 30]);
		var_dump($bool);		// 返回更新是否成功: bool(true)

		// 修改
		$rowNum = DB::update('UPDATE student SET age = ? WHERE name = ?', [20, 'Tom']);
		var_dump($rowNum);		//  返回更新的行数: int(1)

		// 删除
		$rowNum = DB::delete('delete FROM student WHERE id > ?', [1001]);
		var_dump($rowNum);		//  返回删除的行数: int(1)
    }

}

# routes/web.php 新建一条路由
Route::any('test1', ['uses' => 'StudentController@test1']);

 查询构造器;

查询构造器是使用 Laravel 操作数据库的必备技能,ORM 操作数据库也需要用到查询构造器

  • Laravel 查询构造器(query builder)提供方便、流畅的接口,用来建立以及执行数据库查找语法
  • 使用 PDO 参数绑定,以保护应用程序免于 SQL 注入,因此传入的参数不需额外转义特殊字符
  • 基本可以满足所有的数据库操作,而且在所有支持的数据库系统上都可以执行

新增数据

<?php
# 在 App/Http/Controllers/StudentController.php 新增一个方法

public function query1(){
	// 插入一条数据并返回 id:
	$id = DB::table('student')->insertGetId([
		'name' 	=> 'Ketty',
		'age'	=> 16
	]);
	var_dump($id);		// 返回插入的条的 id:int(1007)
	
	// 一次插入多条数据:
	$bool = DB::table('student')->insert([
        ['name' => 'name1', 'age' => 12],
        ['name' => 'name2', 'age' => 13]
    ]);
    var_dump($bool);    // 返回更新是否成功: bool(true)
	
}

# routes/web.php 新建一条路由
Route::any('query1', ['uses' => 'StudentController@query1']);

2.2 修改数据;

  • 更新为指定内容
  • 自增和自减
<?php
# 在 App/Http/Controllers/StudentController.php 新增一个方法

public function query2(){
	// 修改返回影响的行数
	$rowNum = DB::table('student')->where('id', 1001)->update(['age' => 30]);
    var_dump($rowNum);		// 返回更新的行数: int(1)

	// 自增(increment)、自减(decrement)
	// 自增 3
	$rowNum = DB::table('student')->where('id', 1001)->increment('age', 3);
	var_dump($rowNum);		// 返回更新的行数: int(1)

	// 自增(减)的时候修改其它 n 个字段
	$rowNum = DB::table('student')
		->where('id', 1001)
		->increment('age', 3, [
			'name' => 'Tom2',
			'gender' => 20
		]);
	var_dump($rowNum);	// 返回更新的行数

}

# routes/web.php 新建一条路由
Route::any('query2', ['uses' => 'StudentController@query2']);

 

2.3 删除数据;

<?php
# 在 App/Http/Controllers/StudentController.php 新增一个方法

public function query3(){
	// delete
    $rowNum = DB::table('student')->where('id', '<=', 1001)->delete();
    var_dump($rowNum);  // 返回更新的行数: int(1)
	
}

# routes/web.php 新建一条路由
Route::any('query3', ['uses' => 'StudentController@query3']);

 

2.4 查询数据;

  • 查询方法:get()first()where()pluck()lists()select()chunk()
<?php
# 在 App/Http/Controllers/StudentController.php 新增一个方法

public function query4(){
	// 获取所有表数据 get()
	$student = DB::table('student')->get();
	dd($student);
	
	// 获取一条数据 first()
	$student = DB::table('student')->orderBy('id', 'desc')->first();
	dd($student);
	
	// 条件查询 where()
	$student = DB::table('student')->where('id', '>=', '1001')->get();
	dd($student);
	
	// 多条件查询 whereRaw()
	$student = DB::table('student')->whereRaw('id >= ? and age > ?', [1001, 18])->get();
	dd($student);

	// 返回结果集中指定的字段 pluck()
	// 5.4 以后 pluck() 取代了 lists()
	$student = DB::table('student')->pluck('name','id');	//id 作为下标,也可以不传
	dd($student);
	
	// 指定多个字段查找 select()
	$student = DB::table('student')->select('id', 'name', 'age')->get();
	dd($student);
	
	// 分批查询 chunk()
	// 每次查 2 条
	DB::table('student')->orderBy('id', 'desc')->chunk(2, function($students) {
    	var_dump($students);
    });
}

# routes/web.php 新建一条路由
Route::any('query4', ['uses' => 'StudentController@query4']);

 

2.5 查询构造器中的聚合函数

聚合函数:count()max()min()avg()sum()

<?php
# 在 App/Http/Controllers/StudentController.php 新增一个方法

public function query5(){
	// 返回记录的总数
	$num = DB::table("student")->count();
	var_dump($num);		// 返回 int(6)

	// 返回最大值
	$max = DB::table("student")->max('age');
	var_dump($max);		// 返回 string(2) "51"

	// 返回最小值
	$min = DB::table("student")->max('age');
	var_dump($min);		// 返回 string(2) "18"

	// 返回平均数
	$avg = DB::table("student")->avg('age');
	var_dump($avg);

	// 返回和
	$sum = DB::table("student")->sum('age');
	var_dump($sum);

}

# routes/web.php 新建一条路由
Route::any('query5', ['uses' => 'StudentController@query5']);

3. Eloquent ORM;

ORM 是使用 Laraval 操作数据库最常用、最方便的方式

  • Laravel 所自带的 Eloquent ORM 是一个优美、简洁的 ActiveRecord 实现、用来实现数据库操作
  • 每个数据表都有一个与之相对应的“模型”(Model)用于和数据表交互

模型的建立

# 给 student 表新建模型文件 App/Student.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model{
	
	// 默认情况下,表名对应的是模型名称的复数(模型 student 对应表名 students)
	// 但是我们没有 students 表,所以我们要指定表
	// 指定表名
	protected $table = 'student';

	// 指定主键
	protected $primaryKey = 'id';
}

# routes/web.php 新建一条路由
Route::any('orm1', ['uses' => 'StudentController@orm1']);

# 在 App/Http/Controllers/StudentController.php 新增引用
use App\Student;
# 再新增一个方法
public function orm1(){

	// 查询表的所有记录 all()
	$students = Student::all()->toArray();	
	var_dump($students);		// 返回一个集合

	// 根据主键进行查询 find()
	$students = Student::find(1001)->toArray();
	var_dump($students);	
	
	// 根据主键查找,没查到抛出异常findOrFail()
	$students = Student::findOrFail(1001)->toArray();
	var_dump($students);

	 查询构造器在 orm 中的使用
	// 查询表的所有记录 get()
	$students = Student::get()->toArray();
	var_dump($students);
	
	// 查询一条记录
	$students = Student::where('id', '>', 1001)->orderBy('age', 'desc')->first()->toArray();
	var_dump($students);
	
	// 分批查询 chunk()
	Student::chunk(2, function($students){
		var_dump($students);
	});

	// 聚合函数
	$num = Student::whereRaw('id >= ? and age > ?', [1001, 18])->count();
	var_dump($num);
	
}

 

新增数据、自定义时间戳及批量赋值的使用;

  • 通过模型新增数据(涉及到自定义时间戳)
  • 使用模型的 create() 方法新增数据(涉及到批量赋值)
<?php
# routes/web.php 新建一条路由
Route::any('orm2', ['uses' => 'StudentController@orm2']);

# 在 App/Http/Controllers/StudentController.php 再新增一个方法
public function orm2(){
	
	// 使用模型新增数据 save()
	// 执行 save() 方法时,默认会自动维护数据表的 created_at 和 updated_at字段
	// 所以这两字段就不需要手动进行管理,当然也可以关闭
	// 修改模型文件 App/Student.php
	// model 文件添加属性:public $timestamps = false;
	// 但是这个功能提好用的,还是打开比较好,可以指定 unix 时间戳
	// // 自动维护时间戳
	// public $timestamps = true;
	// // 添加返回时间戳方法
	// public function getDateFormat(){
	//	return time();
	// }
	
	$student  = new Student();
	$student->name = 'Berry';
    $student->age = 22;
    $bool = $student->save();
    var_dump($bool);	// 返回一个布尔值

	// 查找
	$student = Student::find(1013);
	echo $student->created_at;	// 虽然插入的时间戳,但是返回的是格式化好的数据: 2019-08-01 05:57:09
	// 如果不想格式化,修改模型文件 App/Student.php
	// 再写一个方法
	// protected function asDateTime($val){
    //    return $val;
    // }


	// 使用模型的 create() 方法
	// 涉及到批量赋值
	// 修改模型文件 App/Student.php
	// //指定允许批量赋值的字段
    //protected $fillable = ['name', 'age'];
	
	// 如果不想允许批量赋值
	// protected $guarded = ['xx'];
    
	$student = Student::create([
		'name' 	=> 'Miranda',
		'age'	=> 18
	]);
	var_dump($student);	// 返回添加成功的数据的对象
	
	// 以属性查找,若没有,新增并取得新的实例:firstOrCreate()
	$student = Student::firstOrCreate(['name' => 'Mosh']);
	var_dump($student);
	
	// 以属性查找,若没有则建立新的实例,如果要保存,调用 save():firstOrNew()
	$student = Student::firstOrNew(['name' => 'Mosh']);
	$bool = $student->save();
	var_dump($bool);
	
}

修改数据;

  • 通过模型更新
  • 结合查询语句批量更新
<?php
# routes/web.php 新建一条路由
Route::any('orm3', ['uses' => 'StudentController@orm3']);

# 在 App/Http/Controllers/StudentController.php 再新增一个方法
public function orm3(){
	
	// 通过模型更新数据
	$student = $student::find(1016); 	// 返回对象
	$student->name = 'Mossssh';
	$bool = $student->save();
	var_dump($bool);		// 修改 name 字段,维护 updated_at 时间戳,返回 bool

	// 结合查询语句批量更新
	$rowNum = Student::where('id','>','1014')->update([
		'age' => 41
	]);
	var_dump($rowNum);
}

删除数据。

  • 通过模型删除
  • 通过主键值删除
  • 根据指定条件删除
<?php
# routes/web.php 新建一条路由
Route::any('orm4', ['uses' => 'StudentController@orm4']);

# 在 App/Http/Controllers/StudentController.php 再新增一个方法
public function orm4(){

	// 通过模型删除
	$student = Student::find(1017);
	$bool = $student->delete();
	var_dump($bool);
	
	// 通过主键值删除
	$num = Student::destroy([1013, 1016]);
	var_dump($num);
	
	// 根据指定条件删除
	$num = Student::where('id', '>', '1012')->delete();
	var_dump($num);
}

 

腾讯云限量秒杀

1核2G 5M 50元/年 2核4G 8M 74元/年 4核8G 5M 818元/年 CDN流量包 100GB 9元

版权声明

本站部分原创文章,部分文章整理自网络。如有转载的文章侵犯了您的版权,请联系站长删除处理。如果您有优质文章,欢迎发稿给我们!联系站长:
愿本站的内容能为您的学习、工作带来绵薄之力。

评论

  • 随机获取
点击刷新
精彩评论

友情链接