Laravel手记

创建Laravel项目

$ composer create-project --prefer-dist laravel/laravel blog

安装依赖

$ brew install composer # 安装composer
$ composer global require laravel/installer # 全局安装laravel

项目使用

$ composer create-project --prefer-dist laravel/laravel blog # 创建blog项目
$ php artisan make:controller TestController # 创建test controller

$ composer require sven/artisan-view # 给artisan增加创建view的功能
$ php artisan make:view test.index # 创建test目录下的view

$ php artisan make:controller PostController --resource # 创建post controller并且自动创建get / post / delete等CURD函数

// 可以通过 Route::resource('post', 'PostController'); 来注册所有路由

$ php artisan route:list # 查看当前项目所有路由

$ php artisan make:migration create_site_table --create=sites # 创建迁移文件create_site_table、数据库表sites
$ php artisan migrate # 执行数据库迁移

$ php artisan make:model UserProfile -m # 可以创建用户模型以及数据表结构,免去执行 make:migration了

$ php artisan make:seeder UsersTableSeeder # 创建填充类
$ php artisan db:seed --class=UsersTableSeeder # 执行填充

$ php artisan make:model Post # 创建数据表模型
$ php artisan make:factory PostFactory --model=Post # 为Post创建模型工厂

$ composer require laravel/ui # 安装前端ui
$ php artisan ui vue --auth # 创建用户认证脚手架代码

mysql 5.57之前的版本,需要在AppServiceProviderboot()中配置Schema::defaultStringLength(191);

自动创建的资源管理方法相关:


image.png
// 为路由设置别名
Route::get('/', 'TaskController@home')->name('task');
$url = route('task');
// 内连查询模式
$posts = DB::table('posts')
    ->join('users', 'users.id', '=', 'posts.user_id')
    ->select('posts.*', 'users.name', 'users.email')
    ->get();

// 左连查询模式 返回左边表所有数据 右边没有的表示为空

$posts = DB::table('posts')
    ->leftJoin('users', 'users.id', '=', 'posts.user_id')
    ->select('posts.*', 'users.name', 'users.email')
    ->get();

// 右连接查询模式 返回右边所有数据表,左边没有的显示为空
$posts = DB::table('posts')
    ->rightJoin('users', 'users.id', '=', 'posts.user_id')
    ->select('posts.*', 'users.name', 'users.email')
    ->get();
// 创建一个访问器,在model类里面创建即可
// 函数名的命名方式为驼峰命名
// 这样后续约定成俗的可以用 $user->display_name 这样的方式来方位
// User.php 
public function getDisplayNameAttribute()
{
    return $this->nickname ? $this->nickname : $this->name;
}

// 使用方法
// UserController.php

public function show($id){
    $user = User::find($id);
    $user->display_name; // 按上面访问器规则,如果未设置nickname则输出name
}

// 创建修改器 需要在mode里创建,
// User.php
public function setCardNoAttribute($value)
{
    $value = str_replace(' ', '', $value);  // 将所有空格去掉
    $this->attributes['card_no'] = encrypt($value);
}

// 通过模型创建
// UserController.php
$user = new User($request->all());
return $user->save();

// 通过模型更新
// UserController.php
$user = User::find($id);
$user->fill($request->all())->save();

// 以上通过模型增加 / 修改需要先更新模型里面的字段白名单,只有白名单的数据才会被更新或创建
// User.php
protected $fillable = [
    'name', 'email', 'password','card_no'
];

模型事件类型:

retrieved:获取到模型实例后触发
creating:插入到数据库前触发
created:插入到数据库后触发
updating:更新到数据库前触发
updated:更新到数据库后触发
saving:保存到数据库前触发(插入/更新之前,无论插入还是更新都会触发)
saved:保存到数据库后触发(插入/更新之后,无论插入还是更新都会触发)
deleting:从数据库删除记录前触发
deleted:从数据库删除记录后触发
restoring:恢复软删除记录前触发
restored:恢复软删除记录后触发

// 通过静态方法监听事件
// app/Providers/EventServiceProvider.php
// 日志默认存放在 storage/logs/laravel.log
public function boot(){
    parent::boot();
    User::retrieved(function ($user) {
        Log::info('从模型中获取用户[' . $user->id . ']:' . $user->name);
    });
}

通过订阅者监听模型事件

// 通过订阅者监听模型事件
// 1. 创建事件 
// 2. 修改填充事件构造方法
// 3. 在 app/Listeners目录创建订阅类 UserEventSubscriber.php
// 4. 在EventServiceProvider中注册订阅者

$ php artisan make:event UserDeleting

// app/Events/UserDeleting.php
public $user;
public function __construct(User $user)
{
    $this->user = $user;
}

user->id . ']:' . $event->user->name);
    }

    // 为订阅者注册监听器
    public function subscribe($events)
    {
        $events->listen(
            UserDeleting::class,
            UserEventSubscriber::class . '@onUserDeleting'
        );
    }
}

// app/Providers/EventServiceProvider.php
protected $subscribe = [
    UserEventSubscriber::class
];

通过观察者监听模型事件

// 通过观察者监听模型事件
// 1. 创建初始化观察者,会自动生成各种监听函数,在里面写逻辑即刻
// 2. 编写逻辑 app/Observers/UserObserver.php
// 3. 在EventServiceProvider中的boot方法中注册

$ php artisan make:observer UserObserver --model=User

// app/Observers/UserObserver.php
public function updated(User $user)
{
    Log::info('已经更新用户到数据库[' . $user->id . ']' . $user->name);
}

// app/Providers/EventServiceProvider.php
public function boot()
{
    parent::boot();
    User::observe(UserObserver::class);
}

填充数据表

// 1. 编写填充器类
// 2. 创建模型工厂 
// 3. 编写模型工厂 UserProfilesFactory
// 4. 在填充器里 调用模型工厂 UserProfilesTableSeeder
// 5. 命令行执行调用命令
$ php artisan make:seeder UserProfilesTableSeeder
$ php artisan make:factory UserProfilesFactory --model UserProfile

// 编写模型工厂
return [
    'user_id'=>$faker->numberBetween(1,20),
    'bio'=>$faker->realText(),
    'city'=>$faker->city()
];

// 在填充器里 调用模型工厂
factory(\App\UserProfile::class, 10)->create();

$ php artisan db:seed --class=UserProfilesTableSeeder

模型关联 一对一

// 建立关联关系,比如用户表 与 用户资料表
// 在用户模型里关联用户资料模型,调用的时候是 $user->profile;
public function profile()
{
    return $this->hasOne(UserProfile::class);
}
// 相对关联,比如用户资料表 与 用户表
public function user()
{
    return $this->belongsTo(User::class);
}

模型关联 一对多

// 建立关联关系,比如在用户表关联文章表,一个用户可以发多个文章

public function posts()
{
    return $this->hasMany(Post::class);
}

// 使用方法
$posts = $user->posts;

// 建立相对的关联关系 比如从文章表关联用户表,用于查询某篇文章是谁发的
public function user()
{
    return $this->belongsTo(User::class);
}
// 使用方法
$author = $post->user; // 获取用户信息

public function author() // 功能与上面的 user() 一样
{
    return $this->belongsTo(User::class, 'user_id', 'id', 'author');
}

渴求式加载 直接一次查询出所有信息

$post = Post::with('author')
    ->where('views', '>', 0)
    ->get();

return $post;

多对多建立关系

// 多对多需要一个中间表来维护关系
// 比如 文章表 与 标签表 需要一个 post_tags 的表来维护
// 设置 post_id 与 tag_id不可以重复 可以避免数据浪费
// 因为多对多是平等关系,所以建立相对关联关系也是一样的操作

// 在Post模型中直接指定tags
public function tags()
{
    return $this->belongsToMany(Tag::class, 'post_tags');
}

// 在Tag模型中指定posts
public function posts()
{
    return $this->belongsToMany(Post::class, 'posts');
}

// 使用的时候直接调用即可
$post = Post::find($id)->tags;
$post = Post::with('tags')->find($id);

// 如有多个with需要绑定,可以给with传递数组
$post = Post::with(['author', 'tags'])->find($id);

分页关键代码

public function fetch()
{
    //                      每页显示6条   当前页码左右显示2个
    $posts = Post::paginate(6)->onEachSide(2)->withPath(url('post'));

    $window = UrlWindow::make($posts);

    $pages = array_filter([
        $window['first'],
        is_array($window['slider']) ? '...': null,
        is_array($window['last']) ? '...':null,
        $window['last']
    ]);

    return response()->json([
        'paginator'=>$posts,
        'elements'=>$pages
    ]);
}

vue使用

// 1. 创建vue组建文件,在resources/js/components目录创建WelcomeComponent.vue
// 2. 注册vue组建 resources/js/app.js
// 3. 在页面中调用即可
Vue.component('pagination-component', require('./components/PaginationComponent.vue').default);

你可能感兴趣的:(Laravel手记)