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 相关文章推荐
PHP初学者头疼问题总结
Jul 08 PHP
php中文字母数字验证码实现代码
Apr 25 PHP
ThinkPHP之getField详解
Jun 20 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
Jan 03 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
Mar 23 PHP
php array_multisort 对数组进行排序详解及实例代码
Oct 27 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
解析 thinkphp 框架中的部分方法
May 07 PHP
PHP使用ActiveMQ实例
Feb 05 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
PHP+redis实现微博的推模型案例分析
Jul 10 PHP
详解PHP Swoole与TCP三次握手
May 27 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源代码安装常见错误与解决办法分享
2013/05/28 PHP
php获取汉字拼音首字母的方法
2015/10/21 PHP
php图片裁剪函数
2018/10/31 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
常用js脚本
2006/12/03 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
2013/12/24 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
详解angularjs结合pagination插件实现分页功能
2017/02/10 Javascript
浅谈JS验证表单文本域输入空格的问题
2017/02/14 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
JS一个简单的注册页面实例
2017/09/05 Javascript
深入理解Vue router的部分高级用法
2018/08/15 Javascript
vue动画打包后失效问题的解决方法
2018/09/18 Javascript
python使用socket向客户端发送数据的方法
2015/04/29 Python
python获取指定路径下所有指定后缀文件的方法
2015/05/26 Python
python 爬取微信文章
2016/01/30 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
python实现五子棋小游戏
2020/03/25 Python
使用pandas的box_plot去除异常值
2019/12/10 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
利用HTML5绘制点线面组成的3D图形的示例
2015/05/12 HTML / CSS
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
linux面试题参考答案(2)
2015/12/06 面试题
办公室驾驶员岗位职责
2013/11/15 职场文书
交通事故检查书范文
2014/01/30 职场文书
ktv总经理岗位职责
2014/02/17 职场文书
药品业务员岗位职责
2014/04/17 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
教师节倡议书2015
2015/04/27 职场文书
指导老师鉴定意见
2015/06/05 职场文书