在众多行业中,程序员属于高薪职业。无论是在国外还是国内,程序员的薪金水平普遍高于其他行业的工作岗位。 高薪的诱惑和充满挑战性的工作,令程序员一直成为备受欢迎的职业。在今年年初,Glassdoor发布的一份调查报告指出,在美国,程序员的就业情况仍然向好。据报告显示,在排名前25位的最能赚钱和需求量最高的工作岗位中,超过一半以上的岗位要求求职人员具备编程技术。因此,要想获得高薪不是一件容易的事情,你得有过硬的本领。 14种最具“吸金”能力的编程语言 据美国Rasmussen College(拉斯姆森学院)在2015年5月发表的一篇文章显示,在数以百计的编程语言中,以下14种编程语言最具“吸金”能力。 文章指出,这个结果是拉斯姆森学院收集了在2014年发布的1800万个招聘广告,以“平均年薪”和“招聘职位”两个指标为基础进行分析而得出来的。 (数据来源:Rasmussen College) 而在Indeed.com今年发布的调查数据则显示,根据编程工作的数量,排在前九位的编程语言如下: 图片来源:www.indeed.com 学习哪种编程语言可以赚到更多钱? 不同的编程语言适合不同的系统,不同的工程师也需要掌握不同的编程语言。 后台或服务器端的程序员通常都懂得Python, Ruby, PHP, Java或 .Net以及数据库的知识。前端或客户端的程序员掌握的编程语言主要是HTML, CSS和JavaScript,能力全面的程序员还具有设计能力。 移动应用的程序员懂得的语言是用于iOS 的Objective-C 或安卓系统的Java, 还有用于移动网站的HTML/CSS,他们当中有些人还懂得服务器的知识。3D或游戏开发者懂得 C/C , OpenGL和动画,同时具有艺术能力的程序员会更有优势。高效程序员懂得C/C 和Java,有的人还有数学和定量分析的能力。 如果你并不介意工程师的类型,Python, Objective-C, JavaScript, HTML和CSS这五种语言是值得学习的。因为每年它们都会出现在“最受欢迎的编程语言”名单中。此外,作为程序员,你还应该学习一些数据库,例如MySQL, MongoDB,而且要学习如何使用它来编程。 出处:网易科技 from:http://www.oschina.net/news/75295/these-programming-language-programmers-pay-the-highest
View Details如下是运行微信支付测试代码时出错代码: Warning: curl_setopt() expects parameter 2 to be long, string given in D:\wwwroot\weixinpaytest\pay\WxPay.JsApiPay.php on line 99 Fatal error: Uncaught exception ‘WxPayException‘ with message ‘curl出错,错误码:60‘ in D:\wwwroot\weixinpaytest\lib\WxPay.Api.php:564 Stack trace: #0 D:\wwwroot\weixinpaytest\lib\WxPay.Api.php(62): WxPayApi::postXmlCurl(‘<xml><appid><![…‘, ‘https://api.mch…‘, false, 6) #1 D:\wwwroot\weixinpaytest\pay\jsapi.php(36): WxPayApi::unifiedOrder(Object(WxPayUnifiedOrder)) #2 {main} thrown in D:\wwwroot\weixinpaytest\lib\WxPay.Api.php on line 564 第一个问题,这个问题完全是微信团队的问题,给出的example就是错的: Warning: curl_setopt() expects parameter 2 to be long, string given in D:\wwwroot\weixinpaytest\pay\WxPay.JsApiPay.php on line 99 找到WxPay.JsApiPay.php文件的99行,curl_setopt($ch, CURLOP_TIMEOUT, 30); 微信团队example代码里少了一个“T”,正确代码应该是 curl_setopt($ch, CURLOPT_TIMEOUT, 30); 这样,这一个问题就解决了。 下面说第二个问题: Fatal error: Uncaught exception ‘WxPayException‘ with message ‘curl出错,错误码:60‘ in […]
View Details本教程示例代码见:https://github.com/johnlui/Learn-Laravel-5 在任何地方卡住,最快的办法就是去看示例代码。 本文基于 Laravel 5.2 版本,无奈 5.2 的中文文档还没有跟上,大家勉强看一下 5.1 的吧: Laravel 5.1 中文文档: http://www.golaravel.com/laravel/docs/5.1/ http://laravel-china.org/docs/5.1 默认条件 你应该懂得 PHP 网站运行的基础知识,并且有了一个完善的开发环境。跟随本教程走完一遍,你将会得到一个基础的包含登录、后台编辑、前台评论的简单 blog 系统。 Tips 环境要求:PHP 5.5.9+,MySQL 5.1+ 本教程不推荐完全不懂 PHP 与 MVC 编程的人学习,Laravel 的学习曲线不仅仅是陡峭,而且耗时很长,请先做好心理准备。 这不是 “一步一步跟我做” 教程。本教程需要你付出一定的心智去解决一些或大或小的隐藏任务,以达到真正理解 Laravel 运行逻辑的目的。 本宝宝使用 Safari 截图是为了好看,宝宝们在开发时请选择 Chrome 哦~ 开始学习 1. 安装 许多人被拦在了学习 Laravel 的第一步:安装。并不是因为安装有多复杂,而是因为【众所周知的原因】。在此我推荐一个 composer 全量中国镜像:http://pkg.phpcomposer.com/ 。启用 Composer 镜像服务作为本教程的第一项小作业请自行完成哦。 镜像配置完成后,在终端(Terminal 或 CMD)里切换到你想要放置该网站的目录下(如 C:\wwwroot、/Library/WebServer/Documents/、/var/www/html、/etc/nginx/html 等),运行命令:
1 2 |
composer create-project laravel/laravel learnlaravel5 |
然后,稍等片刻,当前目录下就会出现一个叫 learnlaravel5 的文件夹,安装完成啦~ 2. 运行 为了尽可能地减缓学习曲线,推荐宝宝们使用 PHP 内置 web 服务器驱动我们的网站。运行以下命令:
1 2 3 |
<span class="hljs-built_in">cd</span> public php -S 0.0.0.0:1024 |
我在本地 hosts 中绑定了 fuck.io 到 127.0.0.1(如果你不会或者不想改 hosts,可以直接使用 127.0.0.1 代理我的 fuck.io),这时候访问 http://fuck.io:1024 就是这个样子的: 这时候你可能要问了:为什么本宝宝的页面是一片空白?请使用开发者工具查看网络请求,只要是 200 状态就说明运行成功了,空白是因为这个页面引用了 Google Fonts,你懂的~ 至于为什么选择 1024 […]
View Details2015年,软件开发界发生了很多变化。有很多流行的新语言发布了,也有很多重要的框架和工具发布了新版本。下面有一个我们觉得最重要的简短清单,同时也有我们觉得值得你在2016年花时间精力去学习的新事物的一些建议。 大趋势 在过去的几年里,有一个越来越明显的趋势是web应用的商业逻辑逐步从后端转移到了前端,然后后端变得只需要处理简单的数据API。这就让前端开发框架的选择变得尤为重要了。 另外一个重要的改变是2015年发布的 Edge 浏览器。这是IE的替代品,拥有全新的界面和更好的性能。跟IE不一样的是它同样采用了跟 FireFox 和 Chrome 一样的快速发布策略。这让JavaScript 开发者社区能够以周为单位获得最新版JavaScript 和 Web标准特性支持而不是像过去一样需要等很多年。 语言和平台 Python 3.5 在今年发布了,带来了很多新特性 比如 Asyncio,为你带来了类似 node.js 的事件机制,还有type hints。 鉴于Python 3 终于真正地火起来了我们强烈建议你替换掉 Python 2。几乎所有的库都已经支持 Python 3 了,所以现在是一个升级历史遗留代码的好时机。 PHP 7 是一个重要的新版本,这个版本修复了很多问题并且带来了新特性和性能提升(看看概览) 。 PHP 7 大约比 PHP 5.6 快2倍, 这对一些大型项目还有WordPress 和 Drupal之类的CMS系统影响很大。 我们强烈推荐 PHP之道,已经更新到最新的PHP7版本。 如果你需要更快的速度并且不介意换一个解释引擎的话,可以试试Facebook在用的 HHVM。 JavaScript 也以ES2015 标准 (大家通常叫做 ES6)的形式发布了更新。 为我们带来了激动人心的新功能。 感谢大多数浏览器版本的快速更新, 对 ES2015 的支持已经非常棒了,并且还有 Babel.js 这样的工具可以让你的新代码跑在低版本浏览器上。 Node.js 在这一年变化很多,开发者社区曾经分裂成 Node.js 和 io.js,然后又再度合并。 经历过这些之后的结局就是我们得到了一个有很多代码贡献者积极维护的项目,并且拥有了两个版本的 Node : 一个稳定的LTS (长期支持) 版本,这个版本注重稳定性,比较适合长期项目和大公司,和一个非长期支持但是最快实现新特征的版本。 Swift 2 在今年初发布了。 这是 Apple 出品的旨在简化 iOS 和 OS X 开发的现代编程语言。 几周前, Swift 正式开源并已经兼容 Linux。这意味着你可以用它来编写服务端应用了。 Go 1.5 在几个月前发布了, […]
View DetailsAES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的AES加密解密算法。 php版代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
<?php class CryptAES { protected $cipher = MCRYPT_RIJNDAEL_128; protected $mode = MCRYPT_MODE_ECB; protected $pad_method = NULL; protected $secret_key = ''; protected $iv = ''; public function set_cipher($cipher) { $this->cipher = $cipher; } public function set_mode($mode) { $this->mode = $mode; } public function set_iv($iv) { $this->iv = $iv; } public function set_key($key) { $this->secret_key = $key; } public function require_pkcs5() { $this->pad_method = 'pkcs5'; } protected function pad_or_unpad($str, $ext) { if ( is_null($this->pad_method) ) { return $str; } else { $func_name = __CLASS__ . '::' . $this->pad_method . '_' . $ext . 'pad'; if ( is_callable($func_name) ) { $size = mcrypt_get_block_size($this->cipher, $this->mode); return call_user_func($func_name, $str, $size); } } return $str; } protected function pad($str) { return $this->pad_or_unpad($str, ''); } protected function unpad($str) { return $this->pad_or_unpad($str, 'un'); } public function encrypt($str) { $str = $this->pad($str); $td = mcrypt_module_open($this->cipher, '', $this->mode, ''); if ( empty($this->iv) ) { $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); } else { $iv = $this->iv; } mcrypt_generic_init($td, $this->secret_key, $iv); $cyper_text = mcrypt_generic($td, $str); $rt=base64_encode($cyper_text); //$rt = bin2hex($cyper_text); mcrypt_generic_deinit($td); mcrypt_module_close($td); return $rt; } public function decrypt($str){ $td = mcrypt_module_open($this->cipher, '', $this->mode, ''); if ( empty($this->iv) ) { $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); } else { $iv = $this->iv; } mcrypt_generic_init($td, $this->secret_key, $iv); //$decrypted_text = mdecrypt_generic($td, self::hex2bin($str)); $decrypted_text = mdecrypt_generic($td, base64_decode($str)); $rt = $decrypted_text; mcrypt_generic_deinit($td); mcrypt_module_close($td); return $this->unpad($rt); } public static function hex2bin($hexdata) { $bindata = ''; $length = strlen($hexdata); for ($i=0; $i amp;< $length; $i += 2) { $bindata .= chr(hexdec(substr($hexdata, $i, 2))); } return $bindata; } public static function pkcs5_pad($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } public static function pkcs5_unpad($text) { $pad = ord($text{strlen($text) - 1}); if ($pad > strlen($text)) return false; if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false; return substr($text, 0, -1 * $pad); } } $keyStr = 'UITN25LMUQC436IM'; $plainText = 'this is a string will be AES_Encrypt'; $aes = new CryptAES(); $aes->set_key($keyStr); $aes->require_pkcs5(); $encText = $aes->encrypt($plainText); $decString = $aes->decrypt($encText); echo $encText,"n",$decString; ?> |
运行结果: fhTD0NNIzv4jUEhJuC1htFFXJ/4S/rL6tDCJPiNvJ8mVLHWOD0HWweuxHynxoZf9 this is a string will be AES_Encrypt java版代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
import java.security.Key; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class CryptAES { private static final String AESTYPE ="AES/ECB/PKCS5Padding"; public static String AES_Encrypt(String keyStr, String plainText) { byte[] encrypt = null; try{ Key key = generateKey(keyStr); Cipher cipher = Cipher.getInstance(AESTYPE); cipher.init(Cipher.ENCRYPT_MODE, key); encrypt = cipher.doFinal(plainText.getBytes()); }catch(Exception e){ e.printStackTrace(); } return new String(Base64.encodeBase64(encrypt)); } public static String AES_Decrypt(String keyStr, String encryptData) { byte[] decrypt = null; try{ Key key = generateKey(keyStr); Cipher cipher = Cipher.getInstance(AESTYPE); cipher.init(Cipher.DECRYPT_MODE, key); decrypt = cipher.doFinal(Base64.decodeBase64(encryptData)); }catch(Exception e){ e.printStackTrace(); } return new String(decrypt).trim(); } private static Key generateKey(String key)throws Exception{ try{ SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES"); return keySpec; }catch(Exception e){ e.printStackTrace(); throw e; } } public static void main(String[] args) { String keyStr = "UITN25LMUQC436IM"; String plainText = "this is a string will be AES_Encrypt"; String encText = AES_Encrypt(keyStr, plainText); String decString = AES_Decrypt(keyStr, encText); System.out.println(encText); System.out.println(decString); } } |
运行结果: fhTD0NNIzv4jUEhJuC1htFFXJ/4S/rL6tDCJPiNvJ8mVLHWOD0HWweuxHynxoZf9 this is a string will be AES_Encrypt 转自: http://alunblog.duapp.com/?p=17
View Details之前还以为从上至下统一用上UTF-8就高枕无忧了,哪知道今天在抓取新浪微博的数据的时候还是遇到字符的异常。 从新浪微博抓到的数据在入库的时候抛出异常: Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90…' 发现导致异常的字符不是繁体而是某种佛经文字。。。额滴神。。。但是按道理UTF-8应该能支持才对啊,他不是万能的么? 原来问题出在mysql上,mysql如果设置编码集为utf8那么它最多只能支持到3个字节的UTF-8编码,而4个字节的UTF-8字符还是存在的,这样一来如果你建表的时候用的utf8字符集出异常就理所当然了。 解决方法很简单,修改字段或者表的字符集为utf8mb4。 比较蛋疼的是,字符集utf8mb4在mysql 5.5.3之后才支持。。。 [2015.03.30]更新: 事实证明只做上面的步骤是无法解决问题的,如果需要解决请参考:http://info.michael-simons.eu/2013/01/21/java-mysql-and-multi-byte-utf-8-support/ 明天要研究如何升级mysql了。。。 参考: http://stackoverflow.com/questions/10957238/incorrect-string-value-when-trying-to-insert-utf-8-into-mysql-via-jdbc http://topic.csdn.net/u/20091107/17/c0eb2463-b4bb-4197-bd67-0459db8aa137.html from:http://blog.csdn.net/shootyou/article/details/8236024
View DetailsMysql数据库上,执行Sql语句: INSERT tn_Areas (AreaCode, ParentCode, Name, PostCode, DisplayOrder, Depth, ChildCount) VALUES ('41030400', '41030000', '瀍河回族区', ", 1557, 3, 0); 报错: [Err] 1366 – Incorrect string value: '\xE7\x80\x8D\xE6\xB2\xB3…' for column 'Name' at row 1 原因:数据库的字符集是gb2312,不能识别繁体字 解决办法:修改数据库字符集为utf8 from:http://c.jinhusns.com/u/lix/b-438
View Details数据库驱动的应用程序往往需要预先填充数据到数据库,以便进行测试和演示。 什么是种子数据 种子数据就是必须要加载了应用程序才能正常运行的数据。大多数应用程序需要在开发、测试和生产中加载一些参考数据。 一般来说,这些数据不是用户创建的,尽管我们可能一次一次的修改它们;我们的数据会依赖这些数据。 种子数据通常是不变的。一般来说,在应用程序中不可被编辑。但是,要求上它是可以被更改的,如果被更改了,种子数据需要被重新加载到部署的应用程序中。 理想的解决方案是自动化的:你没必要去关心它。当你签出代码,启动你的应用,他就准备好了。它应该提供数据完整性:创建的记录应通过您的验证。它应该很容易更新种子数据。 数据库填充与迁移 在前几节我们讲到了数据迁移,数据迁移可以创建数据表的结构,其实,数据迁移也同样可以插入数据,需要创建一个新的迁移文件:
1 |
1 php artisan migrate:make seed_authors_table |
运行如下: 编辑新生成的文件2014_03_12_063755_seed_authors_table.php,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
1 <?php 2 use Illuminate\Database\Schema\Blueprint; 3 use Illuminate\Database\Migrations\Migration; 4 5 class SeedAuthorsTable extends Migration { 6 7 /** 8 * Run the migrations. 9 * 10 * @return void 11 */ 12 public function up() 13 { 14 DB::table('authors')->insert( 15 array( 16 array( 17 'name' => 'Bowen', 18 'age' => 25, 19 'active'=> 1, 20 'email'=>'bowen@nova.com', 21 'bio' => '', 22 'role_id' => 2 23 ), 24 array( 25 'name' => 'Judith', 26 'age' => 21, 27 'active'=>0, 28 'email'=>'judith@nova.com', 29 'bio' => '', 30 'role_id' => 1 31 ) 32 )); 33 } 34 35 /** 36 * Reverse the migrations. 37 * 38 * @return void 39 */ 40 public function down() 41 { 42 DB::table('authors')->delete(); 43 } 44 } |
运行该迁移文件如下: 查看数据库”authors”表,发现多了两条数据: 数据库迁移填充的坏处 虽然我们可以使用数据库迁移的方式进行填充,但是这种方式有很多的缺点: 如果执行了迁移的回滚操作,那么我们添加的数据将会丢失; 更改数据比较麻烦 Laravel数据库填充(Seeder) 从4开始,artisan现在提供了一种巧妙的方式填充数据库。迁移永远不应该被应用于填充数据库。数据填充使用artisan db:seed命令,来非常简单的完成填充操作。 这个简单的方式通过填充类使用测试数据填充您的数据库。所有的填充类都存放在app/database/seeds 目录下。填充类可以以形式命名,但最好遵循一些合理的约束,比如 UserTableSeeder等。默认情况下,一个 DatabaseSeeder 类以为您定义。在这个类中,您可以使用 call 函数运行其他填充类,允许您控制填充顺序。 创建新的填充文件 要给”authors”表填充数据,在app/database/seeds 目录下创建新的文件AuthorTableSeeder.php,编辑该文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
1 <?php 2 3 class AuthorTableSeeder extends Seeder { 4 public function run() 5 { 6 Author::create(array( 7 'name' => 'Test1', 8 'age' => 25, 9 'active'=> 1, 10 'email'=>'test1@nova.com', 11 'bio' => '', 12 'role_id' => 2 13 )); 14 } 15 } |
然后执行artisan命令行:
1 |
1 php artisan db:seed --class=AuthorTableSeeder |
然后数据库中就会新加入一条记录。 还有一种全局的执行方法php artisan db:seed,可以执行多个填充类。该方法是执行的DatabaseSeeder这个类,我们编辑这个类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
1 class DatabaseSeeder extends Seeder { 2 3 /** 4 * Run the database seeds. 5 * 6 * @return void 7 */ 8 public function run() 9 { 10 Eloquent::unguard(); 11 12 $this->call('AuthorTableSeeder'); //调用'AuthorTableSeeder'填充类 13 14 $this->command->info('Employee table seeded!'); 15 } 16 17 } |
您也可以使用 migrate:refresh 命令填充数据库,将会回滚并重新运行所有迁移:然后执行php artisan db:seed,这时同样会成功添加数据。
1 |
1 php artisan migrate:refresh --seed |
参考资料:http://laravelbook.com/laravel-database-seeding 未完待续…… from:http://www.cnblogs.com/huangbx/p/Laravel_6.html
View Details默认假设 所有的列在定义的时候都有默认的假设,你可以根据需要重写。 Laravel假定每个表都有一个数值型的主键(通常命名为”id”),确保新加入的每一行都是唯一的。Laravel只有在每个表都有数值型主键时才会正常运行。所以,对于每一个Laravel应用,都要确保定义的主键使用的是increments()方法。 列在默认情况下为NOT NULL。 现在,让我们一行行分析结构生成器生成的authors表,下面是up()方法中的代码:
1 2 3 4 5 6 7 8 9 10 11 |
1 // auto increment id (primary key) 2 $table->increments('id'); 3 4 $table->string('name'); 5 $table->integer('age')->nullable(); 6 $table->boolean('active')->default(1); 7 $table->integer('role_id')->unsigned(); 8 $table->text('bio'); 9 10 // created_at, updated_at DATETIME 11 $table->timestamps(); |
实际上生成的SQL代码为:
1 2 3 4 5 6 7 8 9 |
1 `id` INT(11) NOT NULL AUTO_INCREMENT, 2 `name` VARCHAR(255) NOT NULL, 3 `age` INT(11) NULL DEFAULT NULL, 4 `active` TINYINT(4) NOT NULL DEFAULT '1', 5 `role_id` INT(10) UNSIGNED NOT NULL, 6 `bio` TEXT NOT NULL, 7 8 `created_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', 9 `updated_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', |
我们会意识到,迁移是多么的强大,我们自需要记住一些结构生成器方法而不是写晦涩难懂的SQL DDL代码。 我们创建了表,那我们想要回滚的时候怎么办呢?只需要在于up()方法对应的down()方法中使用drop()方法即可。
1 2 3 4 |
1 public function down() 2 { 3 Schema::drop('authors'); 4 } |
这个方法非常简单,只有一行。它的全部作用就是删除”authors”表,如果你熟悉sql,它等同于DROP TABLE authors。 现在,我们已经写好了架构,我们就可以对数据库执行迁移文件了。转到命令行工具,跳转到应用目录下,运行artisan migrate命令:
1 |
1 php artisan migrate |
执行结果如下: 检查数据库,你会发现已经有了”authors”表, 表结构如下: 如果你要使用sql语句实现这张表,那么sql查询语句如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
1 CREATE TABLE `authors` ( 2 id int AUTO_INCREMENT NOT NULL, 3 name varchar(255) NOT NULL, 4 age int, 5 active tinyint NOT NULL DEFAULT '1', 6 role_id int(10) UNSIGNED NOT NULL, 7 bio text NOT NULL, 8 created_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 9 updated_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 10 email varchar(64) NOT NULL, 11 /* Keys */ 12 PRIMARY KEY (id) 13 ) ENGINE = InnoDB; |
现在假设我们上次的执行存在错误想要回滚,我们自需要使用artisan命令行工具执行下面的命令即可:下一次,如果你想修改数据模型,你可以创建一个新的迁移,再次执行命令artisan migrate。每一次执行artisan migrate命令,它都会根据时间戳去检查哪些没有执行,如果执行了,就跳到下一个文件,如果没有执行,就执行这次迁移,直到执行完所有迁移文件。
1 |
1 php artisan migrate:rollback |
运行如下: 你会发现,表”authors”已经从数据库中删除了。 现在重新创建”authors”表,执行artisan migrate命令:
1 |
1 php artisan migrate |
这时,表”authors”又重新创建了。 但是我想在表中添加”email”列。先使用artisan创建新的迁移文件:
1 |
php artisan migrate:make add_email_to_authors_table |
运行结果如下: 然后编辑2014_03_12_051119_add_email_to_authors_table.php文件,添加电子邮件列。我们使用Schema::table()方法,有两个参数:表名、闭包函数(在此函数内添加字段)。
1 2 3 4 5 6 |
1 public function up() 2 { 3 Schema::table('authors', function($table) { 4 $table ->string('email', 64); 5 }); 6 } |
有了添加方法,当然也需要添加回滚方法了,这里再次使用Schema::table()方法。
1 2 3 4 5 6 |
1 public function down() 2 { 3 Schema::table('authors', function($table) { 4 $table ->dropColumn('email'); 5 }); 6 } |
上面的方法使用了dropColumn()方法上出列。 现在运行artisan命令运行该迁移文件如下: 刷新数据库表,你会发现”email”字段已经在”authors”中出现了,如下图: 如果我们回滚了这次迁移,那么email字段会从表中删除。 Artisan命令还有一个更强大的命令行,它可以回滚所有的迁移:
1 |
1 php artisan migrate:reset |
表操作 Laravel 方法 目的 create() 用一个名称创建的表。第二个参数是包含表定义的闭包。 drop() 可以通过drop()方法删除表。删除一个表同时会删除它的所有列和任何索引。 dropIfExists() 删除表 (如果存在)。 rename($to) 重命名表。 列操作 Laravel 方法 目的 dropColumn($columns) 删除指定的列。请记住任何与该列关联的索引也将被删除。 dropColumns() 删除指定的列。 索引的操作 Laravel 方法 目的 primary($columns, $name = null) 指定表的主键。 unique($columns, $name = null) 指定表的唯一索引。 index($columns, $name = null) […]
View Details