laravel数据库常用操作
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);
}
版权声明
本站部分原创文章,部分文章整理自网络。如有转载的文章侵犯了您的版权,请联系站长删除处理。如果您有优质文章,欢迎发稿给我们!联系站长:
愿本站的内容能为您的学习、工作带来绵薄之力。
评论