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类中可以定义

浙公网安备 33010602011771号