Laravel慕课网笔记

个人总结

*1.Request

laravel中的Request有两处,方法都是一样的,但是\Illuminate\Support\Facades\Request是静态方法,要用$request::all()另一种Illuminate\Http\Request;是非静态方法,要用$request->all(); 我们来看一下第一种的Request类,如下图。载看下Illuminate\Http\Request类,实现了所有的方法。

Laravel慕课网笔记_第1张图片
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'目录

你可能感兴趣的:(Laravel慕课网笔记)