laravel 数据迁移与 Eloquent ORM的实现方法


Posted in PHP onApril 12, 2019

导语

数据库可以说是后端开发最常用,也是最重要的部分。laravel 提供了很实用的 Eloquent ORM 模型类,简单、直观的与数据库进行交互。同时使用数据迁移管理数据库,可以与团队进行共享以及编辑。二者的更多介绍请查看下方的文档。
以下使用二者进行示例,需求是记录用户浏览记录。请勿将本示例带入实际项目中,本文仅作示例。实际项目根据需求进行记录,以及选择存储方式。

创建数据表

第一步当然是创建数据表了。使用 artisan 命令可以很方便的创建模型以及数据迁移。php artisan make:model Models/BrowseLog -m-m 参数在创建模型的同时也创建了数据迁移文件。执行过上述命令后,新增了 app/Models/BrowseLog.php 以及 database/migrations/{now_date}_create_browse_logs_table.php 两个文件。
接下来编辑 {now_date}_create_browse_logs_table.php 来创建数据表

/**
  * Run the migrations.
  *
  * @return void
  */
 public function up()
 {
  Schema::create('browse_logs', function (Blueprint $table) {
   $table->increments('id');
   $table->ipAddress('ip_addr')->comment('ip 地址');
   $table->string('request_url', 20)->comment('请求 url');
   $table->char('city_name', 10)->comment('根据 ip 获取城市名称');
   $table->timestamps();
  });

  DB::statement("ALTER TABLE `browse_logs` comment'浏览记录表'"); // 表注释
 }

代码如上,编辑完成后,执行命令 php artisan migrate 会将所有未执行迁移的数据表创建。如下

laravel 数据迁移与 Eloquent ORM的实现方法

个人感觉,laravel 默认的数据类型值得商榷。例如 ipAddress(),数据格式为 varchar(45),其实可以使用 ip2long 转换成 int 进行存储。timestamps() 也可以使用时间戳进行存储。当然 laravel 也提供了 访问器 & 修改器 方便维护。各位实际项目中自行选择。

定义中间件

定义一个全局中间件,每一次请求都会被执行。执行 php artisan make:middleware BrowseLog,创建了 app/Http/Middleware/BrowseLog.php 文件。
将创建好的中间件添加到 app/Http/Kernel.php 中,如下

laravel 数据迁移与 Eloquent ORM的实现方法

记录数据

最后在中间件中,记录数据到数据库即可,代码如下

/**
  * Handle an incoming request.
  *
  * @param \Illuminate\Http\Request $request
  * @param \Closure $next
  * @return mixed
  */
 public function handle($request, Closure $next)
 {
  $log = new \App\Models\BrowseLog();

  $log->ip_addr = $request->getClientIp();
  $log->request_url = $request->path();
  $log->city_name = get_city_by_ip();

  $log->save();

  return $next($request);
 }

访问几个链接后,去数据库看下

laravel 数据迁移与 Eloquent ORM的实现方法

数据写入正常,本次的示例就到此为止。

参考资料:数据库操作 —— 迁移、Eloquent ORM —— 快速入门。

PHP 相关文章推荐
Uncaught exception com_exception with message Failed to create COM object
Jan 11 PHP
set_include_path和get_include_path使用及注意事项
Feb 02 PHP
php中apc缓存使用示例
Dec 25 PHP
php ci框架中加载css和js文件失败的原因及解决方法
Jul 29 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
Nov 29 PHP
利用PHP将部分内容用星号替换
Apr 21 PHP
php判断邮箱地址是否存在的方法
Feb 13 PHP
linux下为php添加iconv模块的方法
Feb 28 PHP
深入浅析yii2-gii自定义模板的方法
Apr 26 PHP
PHP实现获取并生成数据库字典的方法
May 04 PHP
PHP ADODB实现事务处理功能示例
May 25 PHP
laravel http 自定义公共验证和响应的方法
Sep 29 PHP
PHP中的Iterator迭代对象属性详解
Apr 12 #PHP
PHP中str_split()函数的用法讲解
Apr 11 #PHP
PHP远程连接oracle数据库操作实现方法图文详解
Apr 11 #PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
Apr 11 #PHP
PHP生成随机码的思路与方法实例探索
Apr 11 #PHP
PHP实现网站应用微信登录功能详解
Apr 11 #PHP
PHP之认识(二)关于Traits的用法详解
Apr 11 #PHP
You might like
PHP脚本的10个技巧(8)
2006/10/09 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
JavaScript 字符编码规则
2009/05/04 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
用v-html解决Vue.js渲染中html标签不被解析的问题
2016/12/14 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
2020/09/04 Javascript
Vue——前端生成二维码的示例
2020/12/19 Vue.js
Python中在for循环中嵌套使用if和else语句的技巧
2016/06/20 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
2017/05/18 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
详解python 注释、变量、类型
2018/08/10 Python
python去除拼音声调字母,替换为字母的方法
2018/11/28 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
Python&&GDAL实现NDVI的计算方式
2020/01/09 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
手机业务员岗位职责
2013/12/13 职场文书
30年同学聚会感言
2014/01/30 职场文书
积极向上的团队口号
2014/06/06 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
公司合作意向书范文
2014/07/30 职场文书
公司行政专员岗位职责
2014/08/24 职场文书
迎新生标语大全
2014/10/06 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
英语演讲开场白
2015/05/29 职场文书
2019毕业论文致谢词
2019/06/24 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis