Laravel 学习笔记 - 基础篇

laravel 目录结构

|- app

  • http
    • Controllers // 控制器目录
      |- bootstrap // 启动配置文件 的目录
      |- config // 所有的配置文件
      |- database // 数据库迁移 与数据填充文件
      |- public // 入口 和 网站的静态资源
      |- resources // 包含了视图的原始资源文件 视图
      |- srorage // 编译后的模板文件 和其他缓存文件
      |- tests // 单元测试 目录 (单元测试代码)
      |- vendor // 加载的依赖模块
  • laravel
    • framework // 框架核心代码 目录

laravel 路由

基本路由


// 该路由直接收 get请求
Route::get('basic1', function () {
    return  'hello world!';
});


// 该路由直接收 post请求
Route::post('basic2', function(){
    return  'basic2';
});

多请求路由

//  match 接受指定的 请求类型
Route::match(['get','post'], 'multy1',function(){
    return 'multy1';
});

// any 相应所有框架支持的类型
Route::any('multy2', function(){
    return 'multy2';
});



路由参数

// 基础的
//
// ---------
//
// Route::get('user/{id}', function($id){
//  return 'User-id-'.$id;
// });
//
// ---------
//
// 访问地址
// http://laravel.study.com/user/1  
// 输出  User-id-1
//
// 如果访问地址中不带 userID参数值的话则  报错
// 即地址:
// http://laravel.study.com/user


// 可有可无的参数
//
// ---------
//
// Route::get('user/{name?}',function($name = null){
//  return 'User-name-'.$name;
// });
//
// ---------
//
// 访问地址
// http://laravel.study.com/user/test  
// 输出  User-name-test
//
// 如果访问地址中不带 name参数值的话 则改值为空
// 即地址:
// http://laravel.study.com/user
// 输出  User-name-



// 设置参数默认值
// ---------
//
// Route::get('user/{sex?}',function($sex = 'man'){
//  return 'User-sex-'.$sex;
// });
//
// ---------
//
// 访问地址
// http://laravel.study.com/user/woman  
// 输出  User-sex-woman
//
// 如果访问地址中不带 sex参数值的话 则默认值为 man
// 即地址:
// http://laravel.study.com/user
// 输出  User-sex-man
//



// 校验 路由参数

// Route::get('user/{name?}', function($name = 'test'){
//  return 'User-name-'.$name;

// // 后面跟上where 条件 其中第二个值是正则表达式
// })->where('name', '[A-Za-z]+');

// 测试
// http://laravel.study.com/user
//
// 输出
// User-name-test
//
// -------
//
// 测试
// http://laravel.study.com/user/zhangsan
//
// 输出
// User-name-zhangsan
//
// -------
//
// 测试
// http://laravel.study.com/user/123
//
// 报错
// 不符合路由规则



// // 校验 多个字段
// Route::get('user/{id}/{name?}', function($id, $name = 'test'){
//  return 'User-id-'.$id.'-name-'.$name;

// // 如果需要校验多个字段的 那么就用数组传参
// // ID 是数字  name 只能是大小写字母
// })->where(['id'=>'[0-9]+', 'name'=>'[A-Za-z]+']);

路由别名

// 路由别名的主要作用是 在使用 route函数 创建路由地址时,
// 可以使用路由别名创建,别名最好 字符少且能表达路由名称 这样好记也好写。


// // Route::get('user/member-center', ['as'=> 'center', function(){
// Route::get('user/center', ['as'=> 'center', function(){


//  // 使用 route 函数 创建url
//  return route('center');
// }]);

路由群组


// // prefix 是路由前缀
// Route::group(['prefix' => 'member'], function(){
//  Route::get('user/center', function(){
//      return 'member-user-center';
//  });

//  Route::any('multy2', function(){
//      return 'member-multy2';
//  });
// });

//
//
// 测试
// http://laravel.study.com/user/center
//
// 报错
// 没有找到该路由
// 因为我们这个路由组 加了一个前缀  
// 要访问 群组里的所有路由  都必须加前缀
//
//
// 测试
// http://laravel.study.com/member/user/center
//
// 输出
// member-user-center
//
//
//
// 测试
// http://laravel.study.com/member/multy2
//
// 输出
// member-multy2

路由中输出视图

// Route::get('view', function(){

//  // 通过 view 函数 直接返回 渲染后的html
//  return view('welcome');
// });

控制器

怎么新建一个控制器

在 目录 app/http/Controllers/ 目录下新建 控制器文件

// 声明命名空间
namespace App\Http\Controllers;

// 定义类
class MemberController extends Controller
{

  // 基础
    // public function info(){
    //  return 'Member-info';
    // }


    // 绑定参数
    public function info($id){
        return 'Member-info-id-'.$id;
    }

}


控制器和路由怎样进行关联

配置 App\Http\目录下的 routes.php

// 换一个 能接受任何请求的
// Route::any('member/info', ['uses'=>'MemberController@info']);

// // 给绑定控制器的路由起别名
// Route::any('member/info', [
//  'uses'=>'MemberController@info',
//  'as' => 'memberinfo'
// ]);


关联控制器后,路由的特性怎么用

// 给绑定控制器的路由起别名
Route::any('member/{id}', [
    'uses'=>'MemberController@info',
    'as' => 'memberinfo'
])->where('id', '[0-9]+');

// 测试
// http://laravel.study.com/member/123123
//
// 输出
//
// Member-info-id-123123
//
//
// 测试
// http://laravel.study.com/member/aaaa
//
// 报错
// 没有找到该路由
//

视图

怎样新建视图

视图文件存放在 resources\views 目录下
视图的默认后缀名是:.blade.php
文件命名最好和方法名一致

最好一个控制器 对应一个目录

怎样输出视图

// 渲染一个模板文件
// public function info($id){
//  return view('member-info');
// }


// 渲染一个模板  带路径
// public function info($id){
//  return view('Member/info');
// }


// 渲染一个带变量的模板
public function info($id){
  return view('Member/info',[
    'name' => '陈小陌',
    'age' => '21'
  ]);
}

模型

怎么新建模型

在APP目录下创建

命名最好和表名称一样并且采用驼峰命名法

File Name: Member.php

怎么使用模型

在控制器中映入模型
然后像普通类一样使用就好了。。。

数据库操作 DB facade

新建数据表与连接数据库


CREATE TABLE IF NOT EXISTS student(
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '姓名',
`age` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄',
`sex` TINYINT UNSIGNED NOT NULL DEFAULT 10 COMMENT '性别',
`created_at` INT NOT NULL DEFAULT 0 COMMENT '新增时间',
`updated_at` INT NOT NULL DEFAULT 0 COMMENT '修改时间'
)ENGINE=INNODB DEFAULT CHARSET = UTF8 AUTO_INCREMENT=1001 COMMENT='学生表';


数据库配置文件
config/database.php

打开发现 配置值都是通过 env 函数获取的

env 函数 读取的就是根目录的 .env 文件

配置 或修改

DB_HOST=127.0.0.1
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root

使用DB facade 实现curd

 ?',[1]);
        // dd($students);


        // // 删除
        // $row = DB::delete('delete from student where id > ?', [1]);
        // var_dump($row);
        // // int(1)
    }
}

数据库操作之 - 查询构造器

查询构造器 简介及新增数据

使用查询构造器修改数据

使用查询构造器删除数据

使用查询构造器查询数据

查询构造器的中的聚合函数

 ?',[1]);
        // dd($students);


        // // 删除
        // $row = DB::delete('delete from student where id > ?', [1]);
        // var_dump($row);
        // // int(1)

    }


    // 查询构造器简介
    // Laravel 查询构造器(query builder)
    //
    // 使用pdo 参数绑定 以保护程序免于SQL注入,
    // 因此传入的参数不需要额外转义特殊字符
    //
    // 基本可以满足所有数据库操作,
    // 而且在所有支持的数据库系统上都可以执行
    //




    // 使用查询构造器 新增数据
    //
    public function query(){


        // // 单条数据插入
        // $status  = DB::table('student')->insert(['name'=>'test', 'age'=>18]);
        // var_dump($status);
        // // bool(true)


        // // 新增时 获取新增ID
        //
        // $id  = DB::table('student')->insertGetId(['name'=>'zhangsan', 'age'=>19]);
        // var_dump($id);
        // // int(4)

        // // 批量新增
        //
        // $status  = DB::table('student')->insert([
        //      ['name'=>'name1', 'age'=>18],
        //      ['name'=>'name2', 'age'=>12],
        //      ['name'=>'name3', 'age'=>13]
        //      ]);
        // var_dump($status);
        // // bool(true)
        //

        // dd(DB::select('select * from student'));
    }


    // 使用查询构造器更新数据
    //
    //
    // 更新为指定的内容
    //
    // 自增和自减
    //
    //

    public function query2(){

        // // 更新数据
        // $num = DB::table('student')
        //  ->where('id', 1)
        //  ->update(['age'=>22]);
     //    var_dump($num);

     //    // int(1)
     //    // 更新数据一定要带条件


//      // 字段 自增
//      $num = DB::table('student')->increment('age');
//      var_dump($num);
//      // int(6)


//      // 字段 自增  可定义步长
//      $num = DB::table('student')->increment('age', 3);
//      var_dump($num);
//      // int(6)


//      // 字段 自减
//      $num = DB::table('student')->decrement('age');
//      var_dump($num);
//      // int(6)       

//      // 字段 自减  可定义步长
//      $num = DB::table('student')->decrement('age', 3);
//      var_dump($num);
//      // int(6)


//      // 字段自增自减   加条件
//      $num = DB::table('student')
//              ->where('id', 1)
//              ->decrement('age');
//      var_dump($num);
//      // int(1)



//      // 自增时 同时修改别的字段数据
//      $num = DB::table('student')
//              ->where('id', 1)
//              ->decrement('age', 1, ['name'=>'chenxiaomo']);
//      var_dump($num);
//      // int(1)
    }


    // 使用查询构造器删除数据
    // delete
    // truncate

    public function query3(){
    //      $num = DB::table('student')
    //              ->where('id', 7)
    //              ->delete();
    //      var_dump($num);
    //      // int(1)

    //      $num = DB::table('student')
    //              ->where('age', '<', 18)
    //              ->delete();
    //      var_dump($num);
    //      // int(1)


    //      // 清空表  慎用
    //      DB::table('student')->truncate();

    }


    // 使用查询构造器查询数据

    // Get 获取表的所有数据

    // first  获取一条记录

    // where  条件容器

    // whereRaw  多条件 容器

    // pluck    返回结果集指定的字段  单个

    // lists    返回结果集的指定字段   区别是  可以使用摸个字段作为键

    // select   查询 指定字段

    // chunk  分段的get 分段获取数据



    public function query4(){


        // 获取表的所有数据
//      $data = DB::table('student')->get();
//      dump($data);


        // 获取一条数据 没有条件时 获取的是第一条
//      $data = DB::table('student')->first();
//      dump($data);


//      // 根据 排序 获取一条
//      $data = DB::table('student')
//                  ->orderBy('id', 'desc')
//                  ->first();
//      dump($data);


//      // 加入查询条件
//      $data = DB::table('student')
//          ->where('age', '>=', '18')
//          ->get();
//      dump($data);

//      // 复合条件 查询
//      $data = DB::table('student')
//          ->whereRaw('id >= ? and age > ?', [2, 16])
//          ->get();
//      dump($data);


//      // 获取符合条件的    只只查询一个字段用这个
//      $data = DB::table('student')
//          ->whereRaw('id >= ? and age > ?', [2, 16])
//          ->pluck('name');
//          // ->pluck('name, age');   报错  哭
//          // ->pluck(['name', 'age']);   报错  哭
//      dump($data);


//      // 查询指定字段  并且用指定字段做下标
//      $data = DB::table('student')->lists('name', 'id');
//      dump($data);


//      // 查询指定字段
//      $data = DB::table('student')
//                  ->select(['id','name'])
//                  ->get();
//      dump($data);



        // chunk
        // 如果数据量大  但是要非要都查询出来的情况下 使用 chunk
        // 第一个参数是步长
        // 第二个是回调函数
        // 根据 步长 来约定  每次查询的数据条数  然后循环查询 直到 查询完毕
        $data = DB::table('student')->chunk(2, function($data){
            dump($data);

            // 如果 遇到某个条件 需要终止查询  那么直接返回 false 即可终止

            // 实例
            // 如果  两个人总的年龄 小于40的话 就退出查询   
            // (当然应该没有这么奇葩的需求)
            $ages = array_column($data, 'age');
            if(array_sum($ages) < 40){
                return false;
            }

        });

    }



    // 查询构造器中的聚合函数

    // count

    // max

    // min

    // avg

    // sum


    public function query5(){


//      // 计数       
//      $data = DB::table('student')->count();
//      
//      // 最小
//      $data = DB::table('student')->min('age');
//      
//      // 最大
//      $data = DB::table('student')->max('age');
//      
//      // 平均值
//      $data = DB::table('student')->avg('age');
//      
//      // 合计
//      $data = DB::table('student')->sum('age');

        dump($data);
    }

}

数据库操作 Eloquent ORM

Eloquent ORM 简介

Eloquent ORM简介

是 laravel自带的
每个数据表都有一个与之相对应的模型(model)用于和数据表交互

模型的建立

在 APP 目录下创建
文件名和表名一致,且用驼峰命名法表示
如果 类中没有申明 对应的表名称,那么默认是以文件名的复数作为 表名
即:
文件名: student
默认表名: students

如果需要制定表名 就声明一个 $table 属性

// 声明 模型对应的关联表
// 指定表名
protected  $table  = 'student';

默认主键名为ID 如果不是则需要进行申明

protected $primaryKey = 'id';

最基础的模型 实例

Eloquent ORM 中的查询

all()

find()

findOrfail();

查询构造器在ORM中的使用


//      // all  获取表的所有数据
//      $students = Student::all();
//      dd($students);
//      // 打印后 发现都是 集合  
//      // 数据内容 在  每个 集合 中的  attributes 字段里
//      

        // 根据主键进行查询
        //
//      $student = Student::find(1);
//      dd($student);


//      // 根据主键进行查找  如果没有找到  则抛出异常
//      $student = Student::findOrFail(1); // 存在的
//      // $student = Student::findOrFail(1001); // 不存在的  抛出异常
//      dd($student);
//      


        // 查询构造器 在 ROM中的使用


//      // 查询所有的表数据
//      $data = Student::get();
//      dump($data);


        // 有条件的查询    查询一条记录
//      $data = Student::where('id', '>', 1)
//              ->orderBy('age', 'desc')
//              ->first();
//      dump($data);


//      // chunk 的使用
//      Student::chunk(2, function($students){
//          dump($students);
//      });
//      

        // 聚合函数的使用
//      $data = Student::count(); // 计数
//      $data = Student::max('age'); // 最大值
//      $data = Student::where('id', '>', 1)->max('age');
//      dump($data);

Eloquent ORM 新增数据, 自定义时间戳 及 批量赋值的使用


  // Eloquent ORM 新增数据, 自定义时间戳 及 批量赋值的使用
    //     通过模型新增数据 (涉及到自定义时间戳)
    //     使用模型的Create方法新增数据(涉及到批量赋值)

    public function orm2(){

        // 使用模型对象新增数据
//  $student = new Student();
//  $student->name = 'zhangsan';
//  $student->age  = 20;
//  $status = $student->save();
//  dump($status);





        // 由于 创建时间  和修改时间的字段名  是 create_at 和 updated_at
        // 这两个是能够被 Laravel 框架 自动识别的  
        // 也就是说能够自动进行维护

        // 开启 时间戳的方法
        // 在模型中  定义 $timestamps 属性  
        // 设置 TRUE 为开启
        // 设置 FALSE 为关闭

        // 我们也可以对 维护时间的两个函数 进行重定义
        // 创建函数为  getDateFormat
        // 读取函数为  asasDateTime($value)
        //    读取 如果默认是时间戳格式的话  会自动转为 2016-11-10 09:49:53 这种格式

        // 查询  自动维护时间戳的部分  
//      $student = Student::find(10);
//      // echo $student->created_at;
//      echo date("Y-m-d H:i:s", $student->created_at);





        // 使用模型的Create方法新增数据
        // 默认 模型里 是不允许批量赋值的
        // 如果要使用批量赋值  需要到模型 重新定义一个 字段

        // 有两个属性来 管理批量赋值 即 $fillable, $guarded
        // $fillable 允许批量赋值的字段列表  用 [] 数组表示值
        // $guarded  不允许批量赋值的字段列表  用 [] 数组表示值

//      $student  = Student::create(
//          ['name'=> 'imooc', 'age'=> 18]
//      );
//      dd($student);






        // firstOrCreate
        // 先按 给出的字段查询数据
        // 如果 找到了 就返回数据
        // 如果 没找到 就新增一条数据 并 返回创建后的实例

        // 存在的
//      $status =  Student::firstOrCreate(
//          ['name'=>'zhangsan']
//      );
//      

        // 不存在的就创建
//      $status =  Student::firstOrCreate(
//          ['name'=> mt_rand(0, 1000)]
//      );


//      dump($status);
//      


        // firstOrNew
        // 以属性查找 数据
        // 如果能查到 数据  就返回数据信息
        // 如果没有找到 就创建实例 但是 不像 firstOrCreate直接插入
        // 如果需要插入到数据库 则 需要手动 调用 save()
        $student = Student::firstOrNew(
            ['name'=>'imoocsss']
        );
        dump($student);
        exit();

        // 保存到数据库
        $status = $student->save();
        dump($status);
    }

使用 Eloquent ORM 修改数据

// 使用 Eloquent ORM 修改数据
    public function orm3(){


        // 修改单条数据

        // 查询数据
//      $student = Student::find(13);
//      dump($student);
//      
//      // 修改
//      $student->name = ' update one';
//      dump($student);
//      
//      // 保存
//      $status = $student->save();
//      dump($status);


        // 修改多条数据  返回的是影响行数
        $status = Student::where('id', '>', 10)->update(['age'=> 28]);
        dump($status);

    }

使用 Eloquent ORM 删除数据

// 使用 Eloquent ORM 删除数据
public function orm4(){

  // 单条删除


  // 通过模型删除
//      $student = Student::find(14);
//      $status = $student->delete();
//      dump($status);


  // 通过主键删除  返回影响行数
//      $status = Student::destroy(13);
//      $status = Student::destroy(11, 12);
//      $status = Student::destroy([11, 12]);



  // 条件 删除
  $status = Student::where('id', '>', 6)->delete();
  dump($status);        
}

Bkade 模板引擎

Blade 模板引擎简介及模板继承的使用

简介

Blade 是 Laravel 自带的模板引擎

模板继承

section
    section 是用来定义一个视图片段的
yield
    yield 是用来指定某个section 的内容
    可以把它想象为占位符
    用子模板来实现它
extends
    继承某个模板
parent
    引入父级的内容
    如果没有引入 则 这块内容会被 直接覆盖
实例
主模板 文件路径 \resources\views\section\layouts.blade.php


    
        
        轻松学会Laravel - @yield('title')
        
    
    
        
@section('header') 头部 @show
@yield('content', '主要内容区域')
视图文件设置

@extends('layouts')



@section('header')
    
    @parent

    header
@stop



@section('sidebar')
    sidebar
@stop



@section('content')
    @parent
    content
@stop

基础语法及 include 的使用

模板中输出变量

模板中调用PHP代码

原样输出

模板中的注释

引入子视图 include的使用

二级视图文件

@extends('layouts')



@section('header')
    
    @parent

    header
@stop



@section('sidebar')
    sidebar
@stop



@section('content')
    content
    
    
    

{{$name}}

{{time()}}

{{date('Y-m-d H:i:s')}}

{{in_array($name, $arr) ? 'true' : 'false'}}

{{var_dump($arr)}}

{{isset($name) ? $name : 'default'}}

{{ $name or 'default'}}

@{{ $name}}

{{-- 模板中的注释 浏览器中看不到的哦--}} {{-- 引入子视图--}} @include('section.common1', ['message'=>'我是错误信息']) @stop
控制器代码
    /**
     * 视图学习1
     * @return [type] [description]
     */
    public function section1(){

        $name = 'test';

        $arr = ['test', 'imooc'];
        
        return view('section/section1', [
            'name'=>$name,
            'arr'=>$arr
        ]);
    }

section/common1(inclued 文件) 代码

我是inclued {{ $message }}

流程控制

if

unless

for

foreach

forelse


@section('content')
    content
    
    
@if ($name == 'imooc') I'm imooc @elseif($name == 'test') I'm test @else who am i? @endif
@if (in_array($name, $arr)) true @else false @endif
@unless($name == 'imooc') I'm imooc @endunless
@for($i=1;$i<=5;$i++)

{{$i}}

@endfor
@foreach($students as $student)

{{$student->name}}

@endforeach {{-- 如果元素为空 则显示 empty的内容--}} @forelse($forelse as $student)

{{$student->name}}

@empty

暂无数据

@endforelse @stop

模板中的url

url

是通过路由的名称来生成 URL

action

是通过制定的控制器和方法 来生产URL

route

是通过路由的别名来生成URL

实例

 url 路由名称生成
action 指定控制器和方法名生成
route 路由别名 生成

课程总结

安装Laravel
核心目录文件
路由
MVC
数据库操作
模板引擎

你可能感兴趣的:(Laravel 学习笔记 - 基础篇)