个人总结
*1.Request
laravel中的Request有两处,方法都是一样的,但是
\Illuminate\Support\Facades\Request
是静态方法,要用$request::all()
另一种Illuminate\Http\Request;
是非静态方法,要用$request->all();
我们来看一下第一种的Request
类,如下图。载看下Illuminate\Http\Request
类,实现了所有的方法。
一. laravel中提供的DB facade(原始查找),查询构造器和Eloquent ORM三种cao zyo操作数据库方式
个人总结 插入的时候返回布尔值,更新和删除的时候返回更新的条数
1.使用DB facade方法
插入:
$bool = DB::insert('insert into student(name,age) values(?,?)',['imooc',19]);
var_dump($bool); //返回的是布尔值
更新:
$num = DB::update('update student set age = ? where name = ?',[20,'sean']);
var_dump($num); //更新成功是1,失败是0
查询:
$students = DB::select('select * from student where id>?',[10]);
dd($students); //查询到的是id大于10的值
删除:
$num = DB::delete('delete * from student where id>?',[10]);
var_dump($num); //结果是删除的行数
2.查询构造器
- laravel查询构造器(query builder)提供方便,流畅的接口,用来建立及执行数据库查找语法
- 使用PDO参数绑定,以保护ying yong应用程序免于SQL注入,因此传入的参数不需要额外转译特殊字符
新增:
$bool = DB::table('student')->insert(['name'=>'imooc','age'=>18]);
//如果插入的时候需要返回插入的id 就把insert换成insertGetId
查询构造器更新数据有两种
一是更新指定的内容,二是自增和自减
$num = DB::table(;student')
->where('id',12)
->update(['age'=>30]);
//自增
$num = DB::table('student')->increment('age',3);
//带条件自增
$num = DB::table('student')
->where('id',12)
->increment('age',3);
//自增的时候让其他字段也改变
$num = DB::table('student')
->where('id',12)
->increment('age',3,['name'=>'zhangsan']);
使用查询构造器删除数据有两种方式 delete truncate(整表删除)
$num = DB::table('student')
->where('id',15)
->delete();
$num = DB::table('student')
->where('id',>,15)
->delete();
整表删除 truncate 不建议使用
DB::table('student')->truncate(); //这个操作不返回任何数据
使用查询构造器查询数据
get() first() where() pluck() lists() select() chunk()
//get
$students = DB::table('student')->get(); //返回所有表数据
//first
$students = DB::table('student')
->orderBy('id','desc')
->first(); //返回一条数据
//where
$students = DB::table('student')
->where('id','>','100')
->get();
$students = DB::table('student')
->whereRaw('id > ? and age > ?',[100,18])
->get();
$students = DB::table('student')
->whereRaw('id > ? and age > ?',[100,18])
->pluck('name');
你也可以在返回的数组中指定自定义的键值字段:
$roles = DB::table('roles')->pluck('title', 'name');
foreach ($roles as $name => $title) {
echo $title;
}
$students = DB::table('student')
->whereRaw('id > ? and age > ?',[100,18])
->lists('name','id'); //取出的结果是'id'=>'name' id是键
$students = DB::table('student')
->select('id','name','age')
->get()
DB::table('student')->chunk(2,function($students){
var_dump($students); //每次查询两条数据
//我们可以在指定的条件下停止查询
if(条件){
return false;
}
//这个时候查询到的是两条数据,因为在一次查询后停止了查询
})
ORM
//all() 得到的是一个集合
$students = Student::all();
//find() 得到的是一条数据
$students = Student::find(100);
//findOrFail() 查询不到会报错
$students = Student::findOrFail(100);
Student::chunk(2,function($students){
var_dump($students);
});
// 使用模型新增数据
$student = new Student();
$student->name = 'zhangsan';
$student->age = 18;
$bool = $student->save();
如果想要在增加数据的时候添加上时间 在模型中
class Student extends Model
{
protect $table = 'student';
protect $primaryKey = 'id';
public $timestamps = true; //自动维护时间戳
//得到的是格式化好的时间
protected function getDateFormat()
{
return time();
}
//得到的是不格式化的时间
protected function asDateTime($val)
{
return $val;
}
}
如果要使用create方法,就要在模型中指定允许批量赋值的字段
protected $fillable = ['name','age'];
活着某个字段不允许批量赋值字段
protected $guarded = [];
// firstOrCreate() 以属性查找信息,有则返回信息,没有则插入数据并返回
$student = Student::firstOrCreate(['name'=>'zhangsan');
// firstOrNew() 以属性查找新的用户,若没有则建立新的实例
$student = Student::firstOrNew(['name'=>'zhangsan']);
$bool = $student->save();
增加
$student = new Student();
$student->name = 'zhangsan';
$student->age = 18;
$bool = $student->save();
ORM修改数据
方法1;
$student = Strudent::find(2);
$student->name = 'lisi';
$bool = $student->save();
方法2: 更新几条数据,返回的就是几
$num = Student::where('id','>','3')->update(['age'=>16]);
ORM删除数据
通过模型删除
$student = Student::find(100);
$bool = $student->delete();
通过主键值删除 可以直接传单个值或者数组
$num = Student::destory(3); //删除了一条数据,shu j值是1
$num = Student::destory(3,4); //删除了两条数据,值是2
$num = Student::destory([3,4]); //删除了两条数据,值是2
根据指定条件删除,删除了多少条就返回几
$num = Student::where('id','>','10')->delete();
二.blade模版
{{ isset($name) ? $name : 'zhangsan' }}
可以改成 {{ $name or 'zhangsan' }}
@{{ $name }} //输出的结果是{{ $name }}
如果想原样输出,
流程控制
unless相当于if的qu fan取反
@unless($name != 'zhangsan')
I am zhangsan
@endunless
forelse 如果有数据就遍历出来,没有就
@forelse($students as $student)
{{ $student->name }}
@empty
我没有名字
@endforelse
模版中的url有三种方式 url('url')
Route::any('url',['as'=>'url','users'=>'StudentController@urlTest')
action('StudentController@urlTest') 通过指定控制器及方法名,生成url
route('url')
传递多个变量
$fuwu = Fuwu::all();
$contact = Contact::all();
$kehuanli = Kehuanli::all();
return view('home.index',compact('fuwu','contact','kehuanli'));
三、路由
路由传递参数时也可以给参数写正则规则。如果指定一个路由参数为可选时,可以在后面加上`?`来实现,但是相应的变量必须有默认值
//必选路由参数
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
//可选路由参数
Route::get('user/{name?}', function ($name = null) {
return $name;
});
//可选路由参数,为参数设置正则
Route::get('user/{$id}/{name?}', function ($id,$name = null) {
return $name;
})where(['id'=>'[0-9]+', 'name'=>'[A-Za-z]+']);
http://localhost/user/5/zhangsan
路由别名:命名路由可以方便的生成url或者重定向(访问的时候,URL地址是不变的),如果有参数,可以作为route()函数的第二个参数传入
Route::get('user/{$id}/profile',function($id){
$url = route('profile');
return redirect()->route('profile');
})->name('profile',['id'=>1]);
四.表单篇
一.Controller
laravel中的请求使用的是symfony/http-foundation组件,
里面存放了 $_GET,$_POST,$_COOKIE,$_FILES,$_SERVER等数据
1.Controller之Request,
它指的是Illuminate\Http里面的Request获取请求的值,判断请求的类型
1.取值 $request->input()
可以给input的值赋值默认值
$name = $request->input('name','zhangsan'); //如果有值就输出得到的值,没有值就输出张三
判断有没有值 $request->has()
if($request->has('name')){
echo $request->input('name');
}else{
echo '无参数';
}
2.判断请求类型
$request->method(); //输出get或者post这种请求类型
判断指定类型是不是我么需要的类型
$bool = $request->isMethod('GET');
判断是不是ajax请求
$bool = $request->ajax();
请求的路径是否符合判断的格式
$bool = $request->is('test/*'); //检测路由是不是test开头的
获取当前的url
$request->url();
2.Controller之Session
* 由于HTTP协议是无状态(Stateless)的,所以session提供一种保存用户数据的方法
* laravel支持了多种session后端驱动,并提供清楚、统一的API。也内置支持如Memcached、Redis和数据库的后端驱动。默认使用"file"的Session驱动。
* session的配置文件在config/session.php中
因为web中间件开启了session,所以我们写路由的时候,可以使用webzhong'jian'jian中间件来使session生效
Route::group(['middleware'=>['web']],function(){
Route::any('session1',['TestController@session']);
Route::any('session2',['uses' => 'TestController@session']);
});
laravel中使用session有三种方式
session取值的时候,可以设置默认值
return Session::get('key1','default');
//也可以以数组的形式存储
\Session::put(['key1' => 'value1']);
//把数据放到session的数组中
Session::push('student','zhangsan');
Session::push('student','lisi');
//取完值就直接删除数据
$res = Session::pull('student','default');//这里d的值还是先前赋的值,再次取值就会是默认值'default'
//取出所有制
$res = Session::all();
//判断某个键是否存在
$bool = Session::has('key1');
// 删除某个值
Session::forget('key1');// 再打印结果,取不到key1的值
//清空所有的值
Session::flush();
//暂存数据
Session::flash('key','value'); //赋值
Sessionget('key'); //取值。只有第一次能qu'dao取到,再取就取不到了
1.HTTP request类的session()方法
public function session1(Request $request)
{
//给key1赋值
$request->session()->put('key1','value1');
}
public function session2(Request $request)
{
// 取值key1
return $request->session()->get('key1');
}
2.session()辅助函数
public function session1()
{
//给key1赋值
session()->put('key1','value1');
}
public function session2()
{
// 取值key1
return session()->get('key1');
}
3.Session facade
public function session1()
{
//给key1赋值
\Session::put('key1','value1');
}
public function session2()
{
// 取值key1
return Session::get('key1');
}
3Controller之Response
相应类型
字符串,视图,Json,重定向
//将数组转换成json输出
$data = ['age'=>19,'name'=>'zhangsan'];
//如果想json格式输出
return response()->json($data);
//重定向
return redirect('session2');
//如果重定向的时候需要带数据,可以在后面添加with()
return redirect('session2')->with('message','我是快闪数据');
return redirect()->action('StudentController@session2')->with('message','我是快闪数据');
return redirect()->route('session2')->with('message','我是快闪数据'); //route()里面的值是路由别名
return redirect()->back();//返回上一级
//重定向的方法里面接受重定向带来的数值
public function session2()
{
Session::get('message','暂无信息'); //如果有信息,就输出,没有则输出默认信息'暂无信息'。快闪信息只能取一次,再取就没有了
}
4.Controller之Middleware
laravel中间件提供了一个方便吧的机制来过滤进入应用程序的HTTP请求
1.例如一个场景,时间通过则往下执行,不通过则去指定路由
2.中间件写好之后要在`app\HTTP\Kernel.php`的`$routeMiddleware`数组里面注册才能生效,
protectd $routeMiddleware = [
'activity' => \App\Http\Middleware\Activity::class,
];
二.玩转laravel表单
1.案例演示
2.静态资源管理及模板布局
3.表单列表及分页的实现
4.通过表单实现新增及操作状态提示功能
// 保存添加
public function save(Request $request)
{
$data = $request->input['Student'];//例子中的Student是个数组
$student = new Student();
$student->name = $data['name'];
$student->age = $data['age'];
$student->sex = $data['sex'];
if($student->save()){
return redirect('student/index');
}else{
return redirect()->back();
}
}
// 添加页面
public function create(Request $request)
{
if($request->isMethod('POST')){
$data = $request->input('Student');
if(Student::create($data)){
return redirect('student/index')->with('success','添加成功');
}else{
return redirect()->back();
}
}
return vieq('student.create');
}
//在模板里面
@if(Session::has('success'))
...{{Session::get('success')}}
@endif
@if(Session::has('error'))
... {{Session::get('error')}}
@endif
5.表单验证及数据保持详解
6.通过模型处理性别
下面的内容写在model层
const SEX_UN = 10; //未知
const SEX_BOY = 20; //男
const SEX_GIRL = 30; //女
public function sex($ind = null)
{
$arr = [
self::SEX_UN => '未知',
self::SEX_BOY => '男',
self::SEX_GIRL => '女',
];
if($ind != null){
return array_key_exists($ind,$arr)?$arr[$ind]:$arr[self::SEX_UN];
}
return $arr;
}
yuan'dai'ma源代码性别选项处理
在模板里面 {{ $student->sex($student->sex) }}
7.通过表单实现修改
修改模板
value="{{ old('Student')['name'] ? old('Student')['name'] : $student->name }}"
性别选项
@foreach($student->sex() as $ind=>$val )
{{ isset($student->sex) && $student->sex = $ind ? 'checked' : '' }}
value = "{{ $ind }}"{{ $val }}
@endforeach
8.表单中查看详情及删除
//详情
public function detail($id)
{
$student = Student::find($id);
return view('student.detail',['student'=> $student]);
}
//删除
public function delete($id)
{
$student = Student::find($id);
if($student->delete() ){
return redirect('student/index')->with('success','删除成功-'.$id);
}else{
return redirect('student/index')->with('error','删失败功-'.$id);
}
}
在模板里面加一个JS提示框
删除
三、高级篇
1.laravel中的数据迁移,有两种方法
1.新建一个students表的迁移
PHP artisan make:migration create_students_table --table 和 --create 参数可以用来指定数据表名称,以及迁移文件是否要jian建立新的数据表
2.生成模型的同事生成迁移文件
php artisan make:model Studen -m
2.数据填充
创建一个填充文件,并完善填充文件
php artisan make:seeder StudentTableSeeder
执行单个填充文件
php artisan db:seed --class= StudengTableSeeder
批量执行填充文件
首先在`seeds/StudentTableSeeder.php`中的`run`方法中添加代码`$this->call(StudentTableSeeder::class);
然后执行`
php artisan db:see
3.文件上传
's3'是亚马逊的磁盘
我们可以新建一个本地盘空间
'uploads' =>[
'driver' => 'local',
'root' => storage_path('app/uploads'),
//如果要上传到public文件夹下面,则 'root'=>public_path('uploads')
],
//这里的`storage_path`对应的是`storage`目录,里面的参数`app`代表 'storage'目录下面的'app'目录