Laravel慕课网笔记

个人总结

*1.Request

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

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();
    
    <!--pluck 返回指定字段-->
$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;
}
    
    <!--lists(lists我试了不行,不知道为什么) 和pluck效果相似 但是他的特别之处是可以指定某个键作为下标-->
$students = DB::table('student')
    ->whereRaw('id > ? and age > ?',[100,18])
    ->lists('name','id'); //取出的结果是'id'=>'name' id是键
    
    <!--select 指定查询字段 -->
    $students = DB::table('student')
            ->select('id','name','age')
            ->get()
<!--chunk 可以分段获取数据,这样查询的数据条数少,减少了数据库压力-->
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
        <p>我没有名字</p>
    @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.例如一个场景,时间通过则往下执行,不通过则去指定路由

<?php
    namespace App\Http\Middleware;
    use Clouse;
    class Activity
    {
    //前置操作
        public function handle($request,Clouse $next)
        {
            if(time() < strtotime('2016-06-05')){
                return redirect('activity0');
            } 
            return $next($request);
        }
        
        //后置操作,
        public function handle($request,Closure $next)
        {
            $request = $next($request);
            //下面的部分是后置操作的代码
            echo '我是后置操作';
        }
    }

?>
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源代码性别选项处理
    <div class="form-group stylish-input">
    <label class="col-sm-4 col-lg-4 control-label required" for="inputLastname">性别</label>
    <div class="col-sm-8 col-lg-8">
        <div id="profile_gender">
            <input type="radio" id="profile_gender_0" name="sex" required="required" value="1" @if ($userInfo['sex'] == 1) checked @endif>
            <label for="profile_gender_0" class="required">男</label>
            <input type="radio" id="profile_gender_1" name="sex" required="required" value="2" @if ($userInfo['sex'] == 2) checked @endif>
            <label for="profile_gender_1" class="required">女</label>
        </div>
    </div>
</div>

在模板里面 {{ $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提示框
<a href="{{ url('student/delete',['id'=>$student->id]) }}" onclick="if(confirm('确定删除吗?') == false ) return false;" >删除</a>

三、高级篇

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'目录
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 先说几句废话,调和气氛。事情的起由来自客户需求频繁变更,伟大的师傅决定横刀立马的改革使用新的框架(created ...
    wsdadan阅读 3,005评论 0 12
  • 过去做事情急,什么东西拿起来就用,不喜欢进行系统性的学习,造成在使用过程中的错误和低效,现在感觉自己耐心多了,用之...
    马文Marvin阅读 1,915评论 0 10
  • 1.路由:通过路由将请求发送至处理函数 2.Laravel是简洁优雅的PHP web开发框架,具有富于表达性且简洁...
    Mr丶T阅读 1,276评论 0 0
  • 原文链接 必备品 文档:Documentation API:API Reference 视频:Laracasts ...
    layjoy阅读 8,519评论 0 121
  • 早早起来,伸个懒腰。 天空中的云朵也似乎在伸伸懒腰尼
    铅笔只演绎黑白阅读 126评论 0 3