美文网首页PHP经验分享
Laravel 学习笔记

Laravel 学习笔记

作者: opso_code | 来源:发表于2017-05-02 18:46 被阅读67次

    路由

    文件位置: app/Http/routes.php

    基础路由get/post

    多请求路由

    
    Route::match(['get', 'post'], 'multy', function(
        return 'multy';
    ));
    
    Route::any('multy', function(
        return 'multy';
    ));
    

    路由参数

    // www.example.com/user/100
    Route::get('user/{id}', function($id){
        return 'User-'. $id;
    });
    
    // 只验证string类型 www.example.com/user/opso
    Route::get('user/{$id}/{name?}', function($id, $name = 'somebody'){
        return 'User-'. $id.' UserName: '. $name;
    })->where(['id' => '[0-9]+', 'name'=> '[A-Za-z]+']); 
    

    路由别名

    便于重定向,和其他的一些调用。

    Route::get('user/member-center', ['as' => 'center', function(){
        return route('center');
    }]);
    

    路由群组

    // www.example.com/memeber/user/100
    Route::get('user/{id}', function($id){
        return 'User-'. $id;
    });
    
    // www.example.com/memeber/multy
    Route::any('multy', function(
        return 'multy';
    ));
    

    路由中输出视图

    // resources/views/welcome.blade.php
    // 或:resources/views/xxxcontroller/xxx.blade.php
    Route::get('/', function () {
        return view('welcome');
    });
    

    模型

    app/ 目录下,继承 Illuminate\Database\Eloquent\Model

    数据库操作

    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;修改其中配置后,调用Illuminate\Support\Facades\DB 中相应的 CURD 方法。

    public function create(){
        DB::insert(
          'insert into student(name, age) VALUES(?, ?) ', 
          array('test'.rand(1, 100), rand(15, 30))
        );
        return DB::select('select * from student');
    }
    

    查询构造器 query builder

    使用 PDO 参数绑定,以保护应用程序免于SQL注入,因此不需要额外转义特殊字符。

    // 多条插入
    DB::table('student')->insert(array(array(),array())); // bool
    // 插入并获取id
    DB::table('student')->insertGetId(array()); // int
    // 带where条件
    DB::table('student')->where('id', '>=', 10)->update(array());
    // 获取所有数据
    DB::table('student')->orderBy('id', 'desc')->get();
    // 多条件查询
    DB::table('student')->whereRaw('id >= ? and age >?', [1001, 18])->get();
    // 过滤字段
    DB::table('student')->pluck('name');
    DB::table('student')->select('name')->get();
    // 或
    DB::table('student')->lists('name', 'id'); // id 字段作为key
    // chunk 分块处理,循环查询 每次查询10条 直到条件满足或操作完才停止
    DB::table('student')->chunck(10, function($students){
        var_dump($students);
        if(condition){
            return false;
        }
    });
    // 聚合函数 count avg min max
    DB::table('student')->count();// int
    

    Eloquent ORM

    对象关系映射ORM (Object Relational Mapping)

    新建 App/Student.php 文件:

    namespace App;
    use Illuminate\Database\Eloquent\Model;
    
    class Student extends Model {
        protected $table = 'student';
        protected $primaryKey = 'id'; // 已默认
    }
    

    方便在 Controller中调用,默认情况下,查询所有数据 格式为 Collection 集合下多个 Student 模型对象

    • 可调用toArray()方法转为数组!Collection 都可以
    • 或者修改 database.php'fetch' => PDO::FETCH_CLASSPDO::FETCH_ASSOC
    Student::all()->toArray();
    // 条件查询与查询构造器相同
    Student::where('id', '>=', 1008)->orderBy('age', 'desc')->first();
    

    模型方式创建数据

    Laravel 会自动维护创建时间和操作时间字段,前提是字段名需要是created_atupdated_at

    // 1. save创建数据
    $student = new Student();
    $student->name = 'opso';
    $student->age = 25;
    $student->save(); // 返回Student obj
    // 2. create 创建数据,前提需要在 Model 下 fillable 属性包括这些字段
    Student::create(array('name' => 'opso2', 'age' => 25));
    // 3. 先根据属性查找数据,不存在则新增!
    Student::firstOrCreate(array('name' => 'opso3'));
    // 4. 先根据属性查找数据,不存在则组装数据,需要调用save后才保存
    $student = Student::firstOrNew(array('name' => 'opso3'))->toArray();
    if(!isset($student['id'])){
        $student->save();
    }
    

    模型方式更新数据

    // 单条修改
    $student = Student::find(1010);
    $student->age = 100;
    $student->save();
    // 多条修改
    Student::where('id', '>', 1010)->update(array('age' => 20));
    

    模型方式删除数据

    // 1. delete
    $student = Student::where(array('id', '>', 1010)->delete();
    // 2. destroy
    Student::destroy(array(1010, 1011, 1012));
    

    Blade 模板引擎

    既简单有强大,可使用原生PHP代码,且被缓存。

    首先在 StudentController@section1 编写代码:

    $name = 'test';
    $students = Student::all();
    // 模板渲染
    return view('student.section1', array('name' => $name,'students' => $students));
    

    新建 views/layouts.blade.php, 作为父类模板

    <html>
    <head>
        <title>App Name - @yield('title')</title>
        <style>
            .header {
                width: 1000px;
                height: 100px;
                margin: 0 auto 20px;
                background: #f5f5f5;
            }
            .main {
                width: 1000px;
                height: 200px;
                margin: 0 auto;
            }
            .main .sidebar {
                float:left;
                width:20%;
                height:inherit;
                background: #f5f5f5;
                border:1px solid #ddd;
            }
            .main .content {
                float:right;
                width:75%;
                height:inherit;
                background: #f5f5f5;
                border:1px solid #ddd;
            }
            .footer {
                width:1000px;
                height:100px;
                margin:0 auto;
                margin-top: 15px;
                background: #f5f5f5;
                border:1px solid #ddd;
            }
        </style>
    </head>
    <body >
        <div class="header">
            @section('header')
            头部
            @show
        </div>
        <div class="main">
    
            <div class="sidebar">
                @section('sidebar')
                侧边栏
                @show
            </div>
            <div class="content">
                @yield('content', "我是主要内容区")
            </div>
        </div>
        <div class="footer">
            @section('footer')
            底部
            @show
        </div>
    </body>
    </html>
    

    新建子模板 views/student/section1.blade.php

    // 继承父类模板
    @extends('layouts');
    // 重写头部
    @section('header');
        这是子类的header
    @stop
    
    // 重写侧边栏
    @section('sidebar');
        这是子类的sidebar
    @stop
    
    @section('content');
        这是子类的content
        <!-- 输出php变量 -->
        <p>{{ $name }}</p>
        
        <!-- 调用php代码 -->
        <p>{{ date('Y-m-d H:i:s') }}</p>
        
        <!-- 原样输出@ -->
        <p>@{{ $name }}</p>
        
        <!-- 模板注释 -->
        {{-- 注释!浏览器查看页面源码不显示 --}}
        
        <!-- 引入子视图 include xxx.blade.php -->
        @include(student.xxx, ['memssage' => '来自子视图'])
    @stop
    
    @if @elseif @else @endif
    
    <!-- if的相反 即! -->
    @unless @endunless
    
    @for($i=0; $i<10; $i++){
      {{ $i }};
    }
    @endfor
    
    <!-- foreach 循环 -->
    @foreach($students as $student)
        {{ $student->name }}
    @endforeach
    
    <!-- forelse 比foreach 多了一层判断 -->
    @forelse($students as $student){
      {{ $student->name }}
    @empty
        <p>null</p>
    @endforelse
    
    <!-- 生成url 在routes.php 存在 urlTest 路由,别名 url -->
    <a href="{{ url('url') }}">url()</a>
    <a href="{{ action('StudentController@urlTest') }}">action()</a>
    <a href="{{ route('url') }}">action()</a>
    

    相关文章

      网友评论

        本文标题:Laravel 学习笔记

        本文链接:https://www.haomeiwen.com/subject/bphhtxtx.html