请选择 进入手机版 | 继续访问电脑版

技术控

    今日:46| 主题:53525
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] orm 系列 之 Eloquent使用1

[复制链接]
不再盼你 发表于 2016-11-30 19:43:21
116 2

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

orm 系列 之 Eloquent使用1

orm 系列 之 Eloquent使用1

   本文会是一个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 ,可以知道数据库的的相关信息。
   

orm 系列 之 Eloquent使用1

orm 系列 之 Eloquent使用1

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

orm 系列 之 Eloquent使用1

orm 系列 之 Eloquent使用1

   下一步是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 的使用,从最简单的表创建开始
  1. Route::get('create_user_table',function(){
  2. Schema::create('users',function( Blueprint $table){
  3. $table->increments('id');
  4. });
  5. });
复制代码
此处create方法接受两个参数,一个是表名,第二个参数是以个闭包,里面我们指定了表的所有字段,我们可以看下create方法
  1. // class Schema/Builder
  2. publicfunctioncreate($table, Closure $callback)
  3. {
  4. $blueprint = $this->createBlueprint($table);
  5. $blueprint->create();
  6. $callback($blueprint);
  7. $this->build($blueprint);
  8. }
  9. protectedfunctionbuild(Blueprint $blueprint)
  10. {
  11. $blueprint->build($this->connection,$this->grammar);
  12. }
复制代码
  此处新建完blueprint后,我们就调用了传入的闭包,在闭包中设置了表的字段,最后通过build真正执行数据库操作,最后调用到了 blueprint 的build方法,传入的connection是数据库连接抽象,负责数据库执行操作,grammar负责sql的拼装,而blueprint本身则存储着grammar拼装sql需要的数据,接着看blueprint的build方法
  1. // class Schema/Blueprint
  2. publicfunctionbuild(Connection $connection, Grammar $grammar)
  3. {
  4. foreach($this->toSql($connection, $grammar)as$statement) {
  5. $connection->statement($statement);
  6. }
  7. }
  8. publicfunctiontoSql(Connection $connection, Grammar $grammar)
  9. {
  10. $this->addImpliedCommands();
  11. $statements = [];
  12. // 此处每个command都有一个相关的grammar的compileCommand函数
  13. foreach($this->commandsas$command) {
  14. $method = 'compile'.ucfirst($command->name);
  15. if(method_exists($grammar, $method)) {
  16. if(! is_null($sql = $grammar->$method($this, $command, $connection))) {
  17. $statements = array_merge($statements, (array) $sql);
  18. }
  19. }
  20. }
  21. return$statements;
  22. }
复制代码
此处关键是toSql函数,最后调用到了grammar的方法,此处是compileCreate方法,其代码就是sql拼装,感兴趣的可以去看代码的。
  下面列举Schema支持的几个常用命令
  1. // 重命名
  2. Schema::rename($previousName, $newName);
  3. // 删除表
  4. Schema::drop($tableName);
  5. Schema::dropIfExists($tableName);
复制代码
介绍完命令后,我们来看下表的列操作,还是看代码
  1. Route::get('create_books_table',function(){
  2. Schema::create('books',function( Blueprint $table){
  3. $table->increments('id');
  4. $table->string('title',30);
  5. $table->integer('pages_count');
  6. $table->decimal('price',5,2);
  7. $table->text('description');
  8. $table->timestamps();
  9. });
  10. });
复制代码
这些column方法,最终调用的都是下面的代码
  1. // class Schema/Blueprint
  2. publicfunctionaddColumn($type, $name, array $parameters = [])
  3. {
  4. $attributes = array_merge(compact('type','name'), $parameters);
  5. $this->columns[] = $column =newFluent($attributes);
  6. return$column;
  7. }
复制代码
  因此 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文件
  1. php artisan make:migration publishers_update
复制代码
第二步:编写文件
  1. publicfunctionup()
  2. {
  3. Schema::create( 'publishers',function( Blueprint $table ){
  4. $table->increments( 'id');
  5. $table->string( 'name');
  6. $table->timestamps();
  7. } );
  8. Schema::table( 'books',function( Blueprint $table ){
  9. $table->integer( 'publisher_id')->unsigned();
  10. $table->foreign( 'publisher_id')->references('id')->on('publishers');
  11. } );
  12. }
  13. publicfunctiondown()
  14. {
  15. Schema::table( 'books',function( Blueprint $table ){
  16. $table->dropForeign( 'books_publisher_id_foreign');
  17. $table->dropColumn( 'publisher_id');
  18. } );
  19. Schema::drop( 'publishers');
  20. }
复制代码
第三步:执行migrate操作
  1. php artisan migrate
复制代码
第四步:rollback migrate操作
  1. php artisan migrate:rollback
复制代码
此处执行完后,数据库中会有新的一张表migrations
   

orm 系列 之 Eloquent使用1

orm 系列 之 Eloquent使用1

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

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



上一篇:Succinc - Discriminated unions, pattern matching and partial applications for C#
下一篇:分享一个react + redux 完整的项目,同时写一下个人感悟
采轩芳 发表于 2016-12-2 02:46:42
你身材很好,好的连孙悟空看见你,都会给你三棍子了。
回复 支持 反对

使用道具 举报

m啦风潇潇? 发表于 2016-12-14 21:37:24
前排,哇咔咔
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )

© 2001-2017 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表