热搜: 分页类  PHP  Windows补丁  验证码  Jpgraph  替换  收机  windows7  Swift  Laravel 
  • 首 页
  •  
     
    当前位置: 首页 » 编程语言 » PHP教程 » 正文

    Laravel专供:实现Schemaless

    放大字体  缩小字体 发布日期:2017-02-05  浏览次数:310
    核心提示:之所以要实现 Schemaless,主要是因为在线 DDL 有很多痛点,关于这一点,我在以前已经写过文章,没看过的不妨看看「史上最LOW的在线DDL解决方案」,不过那篇文章主要以介绍为主,并没有涉及具体的实现,所以我写了一个 Laravel 的例子。首先创建测试用的 user

    之所以要实现 Schemaless,主要是因为在线 DDL 有很多痛点,关于这一点,我在以前已经写过文章,没看过的不妨看看「 史上最LOW的在线DDL解决方案 」,不过那篇文章主要以介绍为主,并没有涉及具体的实现,所以我写了一个 Laravel 的例子。

    首先创建测试用的 users 表,并且添加虚拟字段 name、address、level:

    mysql> CREATE TABLE users (
               id INT UNSIGNED NOT NULL AUTO_INCREMENT,
               created_at timestamp null,
               updated_at timestamp null,
               data JSON NOT NULL,
               PRIMARY KEY(id)
           );
    
    mysql> ALTER TABLE users add name VARCHAR(100) AS
           (JSON_UNQUOTE(JSON_EXTRACT(data, '$.name'))) AFTER id;
    
    mysql> ALTER TABLE users add address VARCHAR(100) AS
           (JSON_UNQUOTE(JSON_EXTRACT(data, '$.address'))) AFTER name;
    
    mysql> ALTER TABLE users add level INT UNSIGNED AS
           (JSON_EXTRACT(data, '$.level')) AFTER name;

    然后是核心代码 Schemaless.php,以 trait 的方式实现:

    <?php
    
    namespace App;
    
    trait Schemaless
    {
        public function getDirty()
        {
            $dirty = collect(parent::getDirty());
    
            $keys = $dirty->keys()->map(function($key) {
                if (in_array($key, $this->virtual)) {
                    $key = $this->getDataColumn() . '->' . $key;
                }
    
                return $key;
            });
    
            return $keys->combine($dirty)->all();
        }
    
        public function save(array $options = [])
        {
            if (!$this->exists) {
                $this->reviseRawAttributes();
            }
    
            return parent::save($options);
        }
    
        public function getDataColumn()
        {
            static $column;
    
            if ($column === null) {
                $column = defined('static::DATA') ? static::DATA : 'data';
            }
    
            return $column;
        }
    
        private function reviseRawAttributes()
        {
            $attributes = collect($this->getAttributes());
    
            $virtual = $attributes->only($this->virtual);
    
            $attributes = $attributes->diffKeys($virtual)->merge([
                $this->getDataColumn() => json_encode($virtual->all()),
            ]);
    
            $this->setRawAttributes($attributes->all());
        }
    }

    接着是 Model 实现 User.php,里面激活了 schemaless,并设置了虚拟字段:

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class User extends Model
    {
        use Schemaless;
    
        protected $virtual = ['name', 'address', 'level'];
    }

    最后是 Controller 实现 UsersController.php,里面演示了如何创建和修改:

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    use App\User;
    
    class UsersController extends Controller
    {
        public function __construct(User $user)
        {
            $this->user = $user;
        }
    
        public function store()
        {
            $user = $this->user;
    
            $user->name = '老王';
            $user->address = '东北';
            $user->level = 1;
            $user->save();
        }
    
        public function update()
        {
            $user = $this->user->find(1);
    
            $user->address = '北京';
            $user->save();
        }
    }

    以后建表的时候,除了主键 id,时间 created_at、updated_at 等少数几个系统字段,其他的数据都可以划到虚拟字段里去,不管表多大,随时随地都可以增减字段。


    小编为您推荐“Laravel专供:实现Schemaless”相关文章

    JSP中操作数据库的常用SQL标签用法总结
    这篇文章主要介绍了JSP中操作数据库的常用SQL标签用法总结,SQL标签封装了数据库访问的通用逻辑,可以简化数据库操作,需要的朋友可以参考下

    Ruby语法笔记
    本文给大家记录的是本人学习ruby之后所记录下来的部分语法知识,分享给有需要的小伙伴,希望对大家能够有所帮助。

    脚本自动添加crontab示例
    这篇文章主要介绍了脚本自动添加crontab示例,需要的朋友可以参考下

    wamp服务器访问php非常缓慢的解决过程
    这篇文章主要介绍了wamp服务器访问php非常缓慢的解决过程,十分的简单实用,有需要的小伙伴可以参考下。

    浅析C++标准库元组(tuple)源码
    这篇文章主要介绍了C++标准库元组(tuple)源码,介绍了什么是元组以及用法,并进行了源码分析,需要的朋友可以参考下

     
    TAGS: Laravel MySQL
     
     
    猜你想看
     
    更多..
    与本文有关Laravel
    • Laravel 5.3前端ajax请求,后端丢失session的问
      微信的h5产品,使用React+Laravel,一个奇怪的现象是只有正常的http请求,在server端可以得到session数据,所有的fetch api调用都无法得到session数据,导致所有的api调用返回401,需要授权。最初后端认为是前端在fetch调用的时候没有加上credentials参数,导
      02-05 关键词:LaravelAjax
    • 在 thinkphp 中使用 laravel 的全部组件
      作为一个使用 php 作为主力语言的公司,不管怎么说,在一些老的项目中,总会碰到使用 thinkphp 的。那么,热爱 laravel 的你,当你去开发新的 feature 时,大胆的去引入 laravel 的组件吧。不管是对于现在的开发效率,还是日后项目的重构,迁移都是有很大帮助
      02-05 关键词:LaravelThinkPHP
    • 使用 Supervisor 管理 Laravel 队列进程
      Supervisor 是一个 Python 写的进程管理工具,有时一个进程需要在后台运行,挂掉后能够自动重启,那么就需要这么一个监控进程的工具。在 Laravel 开发中,也经常使用到队列监听,配合 Supervisor 来管理 Laravel 队列进程是一个很好的方式。Supervisor的安装1
      02-05 关键词:SupervisorLaravel
    • 升級 Laravel Homestead
      升級 Laravel Homestead
      Laravel Homestead Laravel Homestead 最新版本已經支援熱騰騰的 PHP 7.1,趕快來更新 Homestead 吧。如果還沒用過 Homestead,可以先看看 Laravel 開發環境使用 Homestead 。 升級 Homestead 程式碼先查一下目前使用的程式碼版本,開啟終端機,切換到 Homest
      02-05 关键词:LaravelVagrant
    • Laravel 5.4 正式发布,PHP 开发框架
      Laravel 5.4 正式发布,PHP 开发框架
      Laravel 5.4 正式发布了。有以下更新:Laravel Dusk当编写接口测试时,Laravel 提供了一组有用的帮助方法,用来方便地单击链接,填充表单文件或提交表单。Laravel 使用 Symfony BrowserKit 组件来模拟 Web 浏览器的行为。但是,如果应用程序使用 JavaScript
      02-05 关键词:Laravel
    • [ Laravel 5.4 文档 ] 序言 —— 发行版本说明
      [ Laravel 5.4 文档 ] 序言 —— 发行版本说明
      Laravel 5.4 在 5.3 的基础继续进行优化:在邮件和通知中支持Markdown、浏览器自动测试框架Laravel Dusk、Laravel Mix、Blade“组件”和“插槽”、在广播频道上进行路由模型绑定、在集合中支持高阶消息传递、基于对象的Eloquent事件、任务级别的“重试”和“
      02-05 关键词:Laravel中间件
    • Codeception 2.2.9 发布,全堆栈 PHP 测试框架
      Codeception 2.2.9 发布了,Codeception 是一个全堆栈的 PHP 测试框架。测试示例:?phpclass UserControllerCest {public $class = 'UserController';public function createAction(CodeGuy $I){$I-haveFakeClass($userController = Stub::make('UserControll
      02-05 关键词:Laravel
    • Laravel 中使用 Redis 数据库
      一、前言Redis 是一个开源高效的键值对存储系统,它通常用作为一个数据结构服务器来存储键值对,它可以支持字符串、散列、列表、集合、有序集合。1. 安装 predis/predis在 Laravel 中使用 Redis 之前,你需要通过 Composer 来安装predis/predis包(~1.0):$
      02-05 关键词:RedisLaravel
    • 组合使用Laravel和vfsStream测试文件上传
      核心要点 在应用开发中,测试是很重要的,在诸多的开发工具中,测试驱动开发是很伟大的一项; 测试文件上传并不像人们想象的那么简单; 目前,有很多很棒,但不为大家所熟知的测试工具; Larval能够让请求的校验更容易; 测试并不需要实际的文件系统,因为如
      02-05 关键词:LaravelPHPUnit
    • 辞旧迎新:悟以往之不谏,知来者之可追
      辞旧迎新:悟以往之不谏,知来者之可追
      ? 回首过去的2016年,Laravel版本经历了两次更新,新增了很多新特性,比如用户认证上的优化,中间件组的引入,又比如事件广播优化,模型搜索,邮件对象,API认证等功能组件的支持,以及前端引入Vue.js,Laravel生态系统在不断完善,持续致力于提升开发效率和
      01-06 关键词:Laravel
     
    相关评论
     
    猜你喜欢
     
    网站首页 | 关于我们 | 联系方式 | 使用协议 | 版权隐私 | 网站地图 | 网站留言