5、数据库增删改查

laravel提供了三种操作数据库的方式

1、DB facade (原始查找)   [fəˈsɑːd]

2、查询构造器

3、Eloquent ORM     [ˈeləkwənt]

 

连接数据库配置

1、config/database.php 保存连接数据库的账号密码

2、但是账号密码指向的是 app/.env 文件

3、所以修改数据地址,数据库名,密码等操作都在 .env 文件完成

4、修改完后重启下 php artisan serve

 

DB facade (原始查找)   [fəˈsɑːd] 

使用DB facade前,先在控制器里进行引入

use Illuminate\Support\Facades\DB; //使用数据库前,先进行数据库的引入

控制器:增删改查

public function shujvku(){
    //
    $shujv = DB::select('select * from news');
    var_dump($shujv); //输出数据,格式乱
    dd($shujv); //输出数据,格式整齐
    
    //
    $bool = DB::insert('insert news(title,author) values(?,?)',['良哥','好好']);
    // 两个问好对应后面数组的两个值。若不加?,sql里面的值是写死的;后面数组里面的值可以动态更改
    // 增加成功后会返回一个布尔值
    var_dump($bool); //布尔值为true,即增加成功
    
    //
    $gai = DB::update('update news set title=? where author=?',["名利阿斯蒂芬肯德基顺利打开附件",'好好']);
    var_dump($gai); //修改成功后,返回修改了多少行
    
    //
    $san = DB::delete('delete from news where Id>?',[10]);
    var_dump($san); //删除成功后,返回删除了多少行
    
}

配置好路由即可将数据的增删改查操作

 

查询构造器

使用查询构造器前,先在控制器里进行引入

use Illuminate\Support\Facades\DB; //使用数据库前,先进行数据库的引入

 

查询构造器:添加数据

public function index(){
    //查询构造器:增
    $bool = DB::table('news') -> insert(['title' => '题目深刻的房间里' , 'author' => '作者顺利打开附件']);
    var_dump($bool);  //插入数据,返回布尔值
    
    //插入成功后,返回该条记录的id
    $id = DB::table('news') -> insertGetId(['title' => '题目深刻11111' , 'author' => '作者顺利打开11111']);
    var_dump($id);  //插入数据,成功后,返回该条记录的id
    
    //插入多条数据
    $duo = DB::table('news') -> insert([
        ['title' => '111111111111111' , 'author' => '1111111111111111'],
        ['title' => '22222222222222' , 'author' => '22222222222222222']
    ]);
    var_dump($duo);  //插入后返回布尔值
}

 

查询构造器:更新数据

public function index(){
    //查询构造器:更新数据
    $num = DB::table('news')
        ->where('Id',14)
        ->update(['title' => '更新11111111']);
    var_dump($num);  //成功后返回影响的行数
}

 

对某些字段进行自增自减,id除外

public function index(){
    //给某个字段的内容全部自增1
    $num1 = DB::table('news') -> increment('count'); //不能对Id进行自增
    //给某个字段的内容全部自增3
    $num2 = DB::table('news') -> increment('count',3);
    var_dump($num1,$num2); //返回受影响的行数
        
    //给某个字段的内容全部自减1
    $num3 = DB::table('news') -> decrement('count'); //不能对Id进行自减
    //给某个字段的内容全部自减3
    $num4 = DB::table('news') -> decrement('count',3);
    var_dump($num1,$num2); //返回受影响的行数
}

给单独某一条记录的字段进行自增或自减

public function index(){
    //给单独某一条记录的字段进行自增或自减
    $num1 = DB::table('news')
    ->where('Id',14)  //查找id为14的那一行
    -> increment('author',3); //将author字段自增3
    var_dump($num1);  //返回受影响的行数
}

 

给某行记录进行自增的同时,对其他字段进行更新

public function index(){
    $num2 = DB::table('news')
    ->where('Id',14)  //查找id为14的那一行
    -> increment('author',3,['title' => '自增的同时修改']); //若要更新多个字段,数组里面再嵌套数组
    var_dump($num2);  //返回受影响的行数
}

 

查询构造器:删除数据

public function index(){
    //查询构造器:删除数据
    $num3 = DB::table('news')
    ->where('Id',14)  //删除某条记录
    ->delete();
    var_dump($num3); //返回受影响的行数
}

 

删除多行数据,删除  >=x  的数据

public function index(){
    //查询构造器:删除数据
    $num3 = DB::table('news')
    ->where('Id','>=',4)  //删除Id>=4的记录
    ->delete();
    var_dump($num3); //返回受影响的行数
}

 

truncate,删除整个表     [trʌŋˈkeɪt]

DB::table('news')->truncate();  //删除某个表,不会返回任何数据

 

查询构造器:查询数据

查询数据表的所有内容

public function index(){
    // 查询表的所有数据
    $num4 = DB::table('news')->get(); //查询news表的所有数据
    dd($num4); //返回结果集
}

 

查询某一条数据,或某一个范围的数据

public function index(){
    //查询某一条数据,或某一个范围的数据
    $data = DB::table('news')
    ->where('Id','>',3)  //查询Id>3的数据
    ->get();
    dd($data);
}

 

查询  符合多个条件的数据(可以试着做登陆验证)

public function index(){
    //查询  符合多个条件的数据(可以试着做登陆验证)
    $deng = DB::table('news')
    ->whereRaw('Id >= ? and title=?',[4,2])  //id>=4,title=2的同一条数据
    ->get();
    dd($deng);
}

 

查询第一条数据

public function index(){
    //first:查询第一条数据,默认正序
    $num5 = DB::table('news')->first();
    //first:查询第一条数据,逆序方式
    $num6 = DB::table('news')->orderBy('Id','desc')->first();
    dd($num5,$num6);
}

 

查询表的某一个字段的所有内容

public function index(){
    //pluck:查询表的某一个字段的所有内容
    $num6 = DB::table('news')
    ->pluck('title');  //查询news表的title字段
    dd($num6);
}

 

查询一个表的多个字段

public function index(){
    //select:查询一个表的多个字段
    $num8 = DB::table('news')
    ->select('title','author','source')
    ->get();
    dd($num8);
}

 

chunk:当数据有上万条时,指定每次查询多少条

public function index(){
    //chunk:当数据有上万条时,指定每次查询多少条
    DB::table('news')
    -> orderBy('Id','asc')  //使用chunk时,必须使用orderBy子句。顺序为asc,逆序为desc
    -> chunk (2,function($count){  //每次查询两条数据,知道数据查完
        echo '<pre>';  //将数据整齐格式化
        var_dump($count);
    });
}

 

查询构造器中的聚合函数

public function index(){
    //count:计算表中有多少数据
    $count = DB::table('news')->count(); //查询news表有多少数据
    var_dump($count); 

    //max:找出某个字段里最大的那个数
    $max = DB::table('news')->max('num'); //news表的num字段的最大那个数
    var_dump($max);

    //min:找出某个字段里最小的那个数
    $min = DB::table('news')->min('num'); //news表的num字段的最小那个数
    var_dump($min);

    //avg:计算出某个字段的平均数
    $avg = DB::table('news')->avg('num'); //news表的num字段的平均数
    var_dump($avg);

    //sum:计算出某个字段的总和
    $sum = DB::table('news')->sum('num');  //news表的num字段总数
    var_dump($sum);
}

 

Eloquent ORM    [ˈeləkwənt]

简述 CRUD

新建模型 

<?php

namespace App; //命名空间,表当前模型的位置

use Illuminate\Database\Eloquent\Model; //继承模型类前需要引入

class Mm extends Model{//指定表名
  protected $table = 'news';

  //指定主键,默认为id
  protected $primaryKey = 'Id';
 
//新增数据时,默认打开时间戳,若不需要可以这样关闭
public $timesstamps = false;

//默认的时间戳不是unicode时间戳,需要在这里进行转换
protected $dateFormat = 'U';
}

 

控制器中使用模型需要引入

use App\Mm;  //使用模型的数据前,先进行模型的引入

 

ORM查询数据 (R)

//all:查询表的所有记录
$mm = Mm::all();
dd($mm);
//还可以使用查询构造器方法,查询表的所有内容
$m = Mm::get();
dd($m);

 

//find:查找某一条id为几的记录
$mm1 = Mm::find(5);
dd($mm1);
//还可以用查询构造器的方法,查询id为几的记录
$m1 = Mm::where('Id','5')->get();
dd($m1);

 

//findOrFail:查找某一条id为几的记录,若找不到就提示 not found
$mm2 = Mm::findOrFail(6);
dd($mm2);

 

//chunk:指定每次查多少条数据
Mm::chunk(2,function($tt){
    var_dump($tt);
});

 

//聚合函数
$count = Mm::count(); //计算数量
$max = Mm::max('num'); //计算num字段最大值
$min = Mm::min('num'); //计算num字段最小值
$avg = Mm::avg('num'); //计算num字段平均数
var_dump($count,$max,$min,$avg);

 

ORM新增数据 (C)

默认插入时间戳,需要自己手动创建字段:created_at、updated_at,其类型都是Int

插入数据:

//新增数据
$Mm = new Mm;  //实例化一个模型
$Mm->title = '标题';
$Mm->author = '作者';
$bool = $Mm -> save();  //返回布尔值,插入成功返回true
var_dump($bool);

 

输出时间戳,默认会将时间戳格式化好

$student = Mm::find(18); //查找id为18的记录
echo $student->created_at; //输出created_at的字段

//将原始时间戳转换为 标准时间格式
$student = Mm::find(18);
echo ('Y-m-d H-i-s',$student->created_at);

 

批量插入数据:

1、默认不允许批量插入数据,需要在模型添加...

protected $fillable = ['name'];  //需要批量赋值多少字段,就在数组里面添加多少值

 

2、用模型的 Create 方法增加数据,控制器批量赋值

//使用模型的 Create方法新增数据
$Mm = Mm::create(
    ['title' => '046题目' , 'author' => '046作者']
);
dd($Mm); //插入成功后,返回Mm模型

 

3、根据特殊情况,可以在Model指定 不允许批量赋值的字段,如:

//指定不允许批量赋值的字段
protected $guarded = ['num'];

 

firstOrCreate:若某字段不存在就添加,并返回该字段的模型。若存在就直接返回该字段的模型,不添加

$Mm = Mm::firstOrCreate(
    ['title' => '101题目' , 'author' => '101作者']
);
dd($Mm);

 

firstOrNew:以属性查找用户,若没有则建立新的实例,若需要保存则可以添加save方法

$Mm = Mm::firstOrNew(
    ['title' => '标题']
);
dd($Mm);

 

Eloquent ORM修改数据 (U)

//通过模型修改数据
$data = Mm::find(19);
$data->time = '时间修改';  //执行修改
$bool = $data->save();  //修改完成后,执行保存,返回布尔值->是否保存成功
var_dump($bool);

//除了用查询构造器find外,还可以用where等等

$num = Mm::where('Id','>',16)->update(
    ['source'=>'中华网']
);
var_dump($num); //执行成功后,返回更新成功的行数

 

Eloquent ORM删除数据 (D)

//通过模型删除
$mo = Mm::find(12); //通过id找到数据
$bool = $mo->delete(); //执行删除,结果返回布尔值
var_dump($bool);

//通过主键删除
$num = Mm::destroy(20); //删除主键为20的值
$num1 = Mm::destroy(20,21); //删除主键为20、21的值
$num2 = Mm::destroy([20,21]); //里面也可以为数组
var_dump($num); //返回受影响的行数

//通过指定条件删除
$numm = Mm::where('Id','>',18)->delete(); //指定条件删除
var_dump($numm); //返回受影响的行数

 

model与model之间的关系绑定

如,一个人可以有多篇文章

在users的model类中可以定义

//将user的id与author_id关联
public function post(){
   return $this->hasMany(Post::class,'author_id');
}

 

在post的model类中可以定义

 

posted @ 2020-06-07 20:48  JaydenQiu  阅读(221)  评论(0)    收藏  举报