2019-02-20

Laravel, Element 使用感想

寒假期间,花费了一些时间熟悉了 Laravel, Element 这两个框架,同时顺便看了 vue bootstrap 的相关内容, 并借写了 一个基于 laravel 的 训练计划 项目在此, 但并没有写完就弃坑了。这里记录一些遇到的问题。

Laravel

数据库中时间戳

laravel 的数据库部分有数据库迁移功能,可用于版本升级时,统一升级数据库,详细请看文档。

使用实例

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    public function up() {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });
    }

    public function down() {
        Schema::dropIfExists('users');
    }
}

但有一个有关于 null 的问题,违背了mysql 最佳实践,可以发现 在 up 函数中 存在 $table->timestamps(); 这两句的作用相当于添加 created_at 和 updated_at 这两个字段,类型为 timestrap,允许null。参考 一千个不用 Null 的理由 此篇文章,可以了解到 字段中存在 null 会造成一些性能问题,像 阿里 的java开发指南明确禁止出现允许null的列。

为了修正这个问题 只能把 $table->timestamps();语句修改为

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));    
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));

但是 laravel 的orm模型中存在软删除的方法,这个方法就是通过判断 deleted_at 字段是否为 null 来判断是否被删除,如果不为空则认为值为删除时间。原有方法的使用参照文档,改进参照 POST 1, POST 2
根据 Mysql 中提到 如果 timestamp 的值是 0 的话,代表的是 0000-00-00 00:00:00 很明显,没有公元0年这一说法。所以软删除模型默认值设置为0在逻辑上是没有问题的。

如果数据库是 postgresql,我没有找到相关的信息,如果有知道的希望能跟我说一声,不胜感激

关于MySQL的 null 的问题主要还是出在 索引和值处理。如果能填了这个坑,就可以nullable了。

数据模型的关系

这没什么太大的坑,除了。。会产生 left join,如果有洁癖,不用就是了;但如果使用的话,不要多重链式调用,如果数据量过大,SQL 会出现性能问题,暂时无解,更换数据库会有所改善。

总结

总的来说 Laravel 使用起来还是让我比较舒服的,考虑到以后的前后端分离,Laravel 可以直接将数组作为json返回; 数据库迁移,模型关系,事件系统,这些用着也很方便。

Element

选中这个前端框架其实是看中了他的表格功能,索性就使用了。但是在前端方面还是稍有不足,就使用了 bootstrap 进行补充。原本是采用 bulma 的,但是发现他跟 element 并不兼容,取舍后 还是放弃了 bulma。

Element 在使用过程中没有遇到什么坑,只有因为接口api给的不够只能换方法解决,可能在服务端渲染这方面并不会存在,但在浏览器端渲染,响应就会觉得Api不够。就顺便学习了一下vue的使用,vue还是很好用的。

由于Bootstrap仍然使用了 jQuery ,所以还得引入 Jquery,jQuery在某些方面来说还是很方便的,bootstrap5将会抛弃jQuery,也许会增加用户的使用体验。

那个项目

可以给之后的要继续维护/更新OJ的有志之士作为练手项目

OnlineJudge 的一些东西也已经开始准备,会慢慢更新文章,共勉~~

-- EOF --

comments

如果无法加载 请将 disqus.com | disquscdn.com 加入代理