orm 系列 之 Eloquent使用1

Eloquent ORM

本文会是一个Eloquent的使用教程,在此之前,我们先讲述下怎么搭建环境,完整的系列请查看orm

基础环境的搭建

记录下怎么用docker搭建laravel的环境

  1. 新建项目composer create-project --prefer-dist laravel/laravel eloquent

  2. 添加laradock

    cd eloquent;git init;git submodule add https://github.com/LaraDock/laradock.git

  3. 创建docker

    docker-compose up -d mysql nginx redis

  4. 进入container,修改.env,DB_HOST=mysql

    docker-compose exec workspace bash

  5. 通过浏览器访问localhost

以上内容的视频教程laradock地址

上面步骤完成后,我们可以通过mac上的Sequel Pro连接数据库,我们通过查看docker-compose.yml,可以知道数据库的的相关信息。

于是就可以通过设置Sequel Pro进行连接了,如下图所示

下一步是phpstorm的设置,可以参考文章如何使用PhpStorm實現TDD、重構與偵錯?

然后再是让如何在PhpStorm活用PHPDoc?,让phpstorm能自动提示laravel中的类。

通过Eloquent的Scheme Builder构建数据库

通过使用Schema Builder我们可以在设计数据库的时候,不写一行sql,通过Schema Builder,我们可以

creating, dropping, and updating a table; adding, removing, and renaming columns

simple indexes,unique indexes and foreign keys

通过将Schema Builder和migration系统结合,我们可以对数据库进行版本控制!这是多么激动的一件事,一旦我们可以对数据库进行版本的控制,我们就能很轻易的将数据库状态设置到我们预期的状态,下面会分两部分进行介绍

  • Schema Builder
  • migrations

先介绍第一个功能Schema Builder

Schema Builder

Schema Builder让我们可以不写一行sql语句,就能完成数据库的设计,下面让我们通过几个例子来看Schema Builder的使用,从最简单的表创建开始

Route::get('create_user_table',function(){
    Schema::create('users',function( Blueprint $table){
        $table->increments('id');
    });
});

此处create方法接受两个参数,一个是表名,第二个参数是以个闭包,里面我们指定了表的所有字段,我们可以看下create方法

// class Schema/Builder
public function create($table, Closure $callback)
{
    $blueprint = $this->createBlueprint($table);

    $blueprint->create();

    $callback($blueprint);

    $this->build($blueprint);
}
protected function build(Blueprint $blueprint)
{
    $blueprint->build($this->connection, $this->grammar);
}

此处新建完blueprint后,我们就调用了传入的闭包,在闭包中设置了表的字段,最后通过build真正执行数据库操作,最后调用到了blueprint的build方法,传入的connection是数据库连接抽象,负责数据库执行操作,grammar负责sql的拼装,而blueprint本身则存储着grammar拼装sql需要的数据,接着看blueprint的build方法

// class Schema/Blueprint
public function build(Connection $connection, Grammar $grammar)
{
    foreach ($this->toSql($connection, $grammar) as $statement) {
      $connection->statement($statement);
    }
}
public function toSql(Connection $connection, Grammar $grammar)
{
    $this->addImpliedCommands();

    $statements = [];
    // 此处每个command都有一个相关的grammar的compileCommand函数
    foreach ($this->commands as $command) {
      $method = 'compile'.ucfirst($command->name);

      if (method_exists($grammar, $method)) {
        if (! is_null($sql = $grammar->$method($this, $command, $connection))) {
          $statements = array_merge($statements, (array) $sql);
        }
      }
    }

    return $statements;
}

此处关键是toSql函数,最后调用到了grammar的方法,此处是compileCreate方法,其代码就是sql拼装,感兴趣的可以去看代码的。

下面列举Schema支持的几个常用命令

// 重命名
Schema::rename($previousName, $newName);
// 删除表
Schema::drop($tableName);
Schema::dropIfExists($tableName);

介绍完命令后,我们来看下表的列操作,还是看代码

Route::get('create_books_table',function(){
    Schema::create('books',function( Blueprint $table){
        $table->increments('id');
        $table->string('title',30);
        $table->integer('pages_count');
        $table->decimal('price',5,2);
        $table->text('description');
        $table->timestamps();
    });
});

这些column方法,最终调用的都是下面的代码

// class Schema/Blueprint
public function addColumn($type, $name, array $parameters = [])
{
    $attributes = array_merge(compact('type', 'name'), $parameters);

    $this->columns[] = $column = new Fluent($attributes);

    return $column;
}

因此Blueprint有两个重要的数据$columns$commands,Grammar在使用的拼装sql的时候,取得数据就是这两个地方来的。

下面将数据库的migration功能。

migrations

migration是为了解决什么问题而引入的?

我们在多人开发的过程中,每个人开发阶段不同、DB状态也不同,整合时无法知道差异,但是如果直接修改DB的话,没有记录也没办法恢复,这时候,我们就需要引入Migration了。

那什么是migration呢?

app/database/migrations/{migration}.php文件是所有对DB操作的动作,里面都是通过代码来完成DB操作的。

操作分为up/down,每个人拿到后进行版本更新,通过执行migrate操作,就可以将DB同步到相同的状态,如果有问题,我们也可以通过rollback回到之前的状态。

我们来看下一个实际的使用例子

第一步:建立migrate文件

php artisan make:migration publishers_update

第二步:编写文件

public function up()
{
    Schema::create( 'publishers', function ( Blueprint $table ) {
      $table->increments( 'id' );
      $table->string( 'name' );
      $table->timestamps();
    } );
    Schema::table( 'books', function ( Blueprint $table ) {
      $table->integer( 'publisher_id' )->unsigned();
      $table->foreign( 'publisher_id' )->references( 'id' )->on( 'publishers' );
    } );
}
 public function down()
 {
     Schema::table( 'books', function ( Blueprint $table ) {
       $table->dropForeign( 'books_publisher_id_foreign' );
       $table->dropColumn( 'publisher_id' );
     } );
     Schema::drop( 'publishers' );
 }

第三步:执行migrate操作

php artisan migrate

第四步:rollback migrate操作

php artisan migrate:rollback

此处执行完后,数据库中会有新的一张表migrations

此处表中batch的作用是,我们每次执行migrate操作,如果有新的migrate操作,就会有新的batch产生,然后我们每次执行rollback,会将最大的batch进行回滚。

总结

本文主要是介绍了使用docker来构建laravel的开发环境,同时,我们也介绍了怎么说会用phpstorm来开发laravel,搭建好环境后,主要介绍了Eloquent的Schema Buildermigrations功能,通过使用Schema Builder,使得我们可以不用写一句sql就可以完成数据库设计,而migrations则使得我们在团队协作中,更好的对数据库进行版本的控制。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容