本文会是一个Eloquent的使用教程,在此之前,我们先讲述下怎么搭建环境,完整的目录请查看 orm
记录下怎么用docker搭建laravel的环境
新建项目 composer create-project --prefer-dist laravel/laravel eloquent
添加laradock
cd eloquent;git init;git submodule add https://github.com/LaraDock/laradock.git
创建docker
docker-compose up -d mysql nginx redis
进入container,修改.env,DB_HOST=mysql
docker-compose exec workspace bash
通过浏览器访问localhost
以上内容的 视频教程 , laradock 地址
上面步骤完成后,我们可以通过mac上的Sequel Pro连接数据库,我们通过查看 docker-compose.yml ,可以知道数据库的的相关信息。
于是就可以通过设置Sequel Pro进行连接了,如下图所示
下一步是phpstorm的设置,可以参考文章 如何使用PhpStorm實現TDD、重構與偵錯?
然后再是让 如何在PhpStorm活用PHPDoc? ,让phpstorm能自动提示laravel中的类。
通过使用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
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 publicfunctioncreate($table, Closure $callback) { $blueprint = $this->createBlueprint($table); $blueprint->create(); $callback($blueprint); $this->build($blueprint); } protectedfunctionbuild(Blueprint $blueprint) { $blueprint->build($this->connection,$this->grammar); }
此处新建完blueprint后,我们就调用了传入的闭包,在闭包中设置了表的字段,最后通过build真正执行数据库操作,最后调用到了 blueprint
的build方法,传入的connection是数据库连接抽象,负责数据库执行操作,grammar负责sql的拼装,而blueprint本身则存储着grammar拼装sql需要的数据,接着看blueprint的build方法
// class Schema/Blueprint publicfunctionbuild(Connection $connection, Grammar $grammar) { foreach($this->toSql($connection, $grammar)as$statement) { $connection->statement($statement); } } publicfunctiontoSql(Connection $connection, Grammar $grammar) { $this->addImpliedCommands(); $statements = []; // 此处每个command都有一个相关的grammar的compileCommand函数 foreach($this->commandsas$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 publicfunctionaddColumn($type, $name, array $parameters = []) { $attributes = array_merge(compact('type','name'), $parameters); $this->columns[] = $column =newFluent($attributes); return$column; }
因此 Blueprint
有两个重要的数据 $columns
和 $commands
,Grammar在使用的拼装sql的时候,取得数据就是这两个地方来的。
下面将数据库的migration功能。
migration是为了解决什么问题而引入的?
我们在多人开发的过程中,每个人开发阶段不同、DB状态也不同,整合时无法知道差异,但是如果直接修改DB的话,没有记录也没办法恢复,这时候,我们就需要引入Migration了。
那什么是migration呢?
app/database/migrations/{migration}.php文件是所有对DB操作的动作,里面都是通过代码来完成DB操作的。
操作分为up/down,每个人拿到后进行版本更新,通过执行migrate操作,就可以将DB同步到相同的状态,如果有问题,我们也可以通过rollback回到之前的状态。
我们来看下一个实际的使用例子
第一步:建立migrate文件
php artisan make:migration publishers_update
第二步:编写文件
publicfunctionup() { 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'); } ); } publicfunctiondown() { 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 Builder 和 migrations 功能,通过使用 Schema Builder ,使得我们可以不用写一句sql就可以完成数据库设计,而 migrations 则使得我们在团队协作中,更好的对数据库进行版本的控制。