laravel数据库常用操作

PHP 来源:用户投稿 收藏

使用 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']);

修改数据:

  • 更新为指定内容

  • 自增和自减

<?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']);

删除数据:

# 在 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']);

查询数据:

  • 查询方法:get()first()where()pluck()lists()select()chunk()

# 在 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']);

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

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

# 在 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']);

Eloquent ORM:

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

  • Laravel 所自带的 Eloquent ORM 是一个优美、简洁的 ActiveRecord 实现、用来实现数据库操作

  • 每个数据表都有一个与之相对应的&ldquo;模型&rdquo;(Model)用于和数据表交互

模型的建立

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() 方法新增数据(涉及到批量赋值)

# 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);
 
}

修改数据:

  • 通过模型更新

  • 结合查询语句批量更新

# 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);
}

删除数据:

  • 通过模型删除

  • 通过主键值删除

  • 根据指定条件删除

# 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.凡本站注明“来源:XXX(非小二胡工作室)”的作品,均转载自其它媒体,所载的文章、图片、音频视频文件等资料的版权归版权所有人所有,如有侵权,请联系xiaoerhu#88.com处理;2.凡本站转载内容仅代表作者本人观点,与小二胡工作室无关。
0 条评论

网友留言