JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式。在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间、集合、字典的处理。 一、JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。 JSON是“名值对”的集合。结构由大括号'{}’,中括号'[]’,逗号’,’,冒号’:’,双引号’“”’组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等。 JSON具有以下的形式: 对象(Object)是一个无序的“名值对”集合,一个对象以”{”开始,”}”结束。每个“名”后跟着一个”:”,多个“名值对”由逗号分隔。如:
1 |
var user={"name":"张三","gender":"男","birthday":"1980-8-8"} |
数组(Array)是值的有序集合,一个数组以“[”开始,以“]”结束,值之间使用“,”分隔。如:
1 |
var userlist=[{"user":{"name":"张三","gender":"男","birthday":"1980-8-8"}},{"user":{"name":"李四","gender":"男","birthday":"1985-5-8"}}]; |
字符串(String)是由双引号包围的任意数量的Unicode字符的集合,使用反斜线转义。 二、对JSON数据进行序列化和反序列化 可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串,并将JSON字符串反序列化为类型实例。DataContractJsonSerializer在System.Runtime.Serialization.Json命名空间下,.NET Framework 3.5包含在System.ServiceModel.Web.dll中,需要添加对其的引用;.NET Framework 4在System.Runtime.Serialization中。 利用DataContractJsonSerializer序列化和反序列化的代码:
1 |
1: using System; |
1 |
2: using System.Collections.Generic; |
1 |
3: using System.Linq; |
1 |
4: using System.Web; |
1 |
5: using System.Runtime.Serialization.Json; |
1 |
6: using System.IO; |
1 |
7: using System.Text; |
1 |
8: |
1 |
9: /// <summary> |
1 |
10: /// JSON序列化和反序列化辅助类 |
1 |
11: /// </summary> |
1 |
12: public class JsonHelper |
1 |
13: { |
1 |
14: /// <summary> |
1 |
15: /// JSON序列化 |
1 |
16: /// </summary> |
1 |
17: public static string JsonSerializer<T>(T t) |
1 |
18: { |
1 |
19: DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); |
1 |
20: MemoryStream ms = new MemoryStream(); |
1 |
21: ser.WriteObject(ms, t); |
1 |
22: string jsonString = Encoding.UTF8.GetString(ms.ToArray()); |
1 |
23: ms.Close(); |
1 |
24: return jsonString; |
1 |
25: } |
1 |
26: |
1 |
27: /// <summary> |
1 |
28: /// JSON反序列化 |
1 |
29: /// </summary> |
1 |
30: public static T JsonDeserialize<T>(string jsonString) |
1 |
31: { |
1 |
32: DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); |
1 |
33: MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); |
1 |
34: T obj = (T)ser.ReadObject(ms); |
1 |
35: return obj; |
1 |
36: } |
1 |
37: } |
序列化Demo: 简单对象Person:
1 |
1: public class Person |
1 |
2: { |
1 |
3: public string Name { get; set; } |
1 |
4: public int Age { get; set; } |
1 |
5: } |
序列化为JSON字符串:
1 |
1: protected void Page_Load(object sender, EventArgs e) |
1 |
2: { |
1 |
3: Person p = new Person(); |
1 |
4: p.Name = "张三"; |
1 |
5: p.Age = 28; |
1 |
6: |
1 |
7: string jsonString = JsonHelper.JsonSerializer<Person>(p); |
1 |
8: Response.Write(jsonString); |
1 |
9: } |
输出结果:
1 |
{"Age":28,"Name":"张三"} |
反序列化Demo:
1 |
1: protected void Page_Load(object sender, EventArgs e) |
1 |
2: { |
1 |
3: string jsonString = "{\"Age\":28,\"Name\":\"张三\"}"; |
1 |
4: Person p = JsonHelper.JsonDeserialize<Person>(jsonString); |
1 |
5: } |
运行结果: ASP.NET中的JSON序列化和反序列化还可以使用JavaScriptSerializer,在System.Web.Script.Serializatioin命名空间下,需引用System.Web.Extensions.dll.也可以使用JSON.NET. […]
View Detailsusing System; using System.Collections.Generic; using System.Text; namespace NET.MST.Fourth.StringByte { class StringByte { static void Main(string[] args) { String s = "我是字符串,I am string"; //字节数组转换到字符串 Byte[] utf8 = StringToByte(s, Encoding.UTF8); Byte[] gb2312 = StringToByte(s, Encoding.GetEncoding("GB2312")); Byte[] unicode = StringToByte(s, Encoding.Unicode); Console.WriteLine(utf8.Length); Console.WriteLine(gb2312.Length); Console.WriteLine(unicode.Length); //转换回字符串 Console.WriteLine(ByteToString(utf8, Encoding.UTF8)); Console.WriteLine(ByteToString(gb2312, Encoding.GetEncoding("GB2312"))); Console.WriteLine(ByteToString(unicode, Encoding.Unicode)); Console.Read(); } static Byte[] StringToByte(String s, Encoding encoding) { return encoding.GetBytes(s); } static String ByteToString(Byte[] b, Encoding encoding) { return encoding.GetString(b); } } } from:http://www.cnblogs.com/brainmao/archive/2011/05/29/2062385.html
View Details介绍 让用户从我们的网站上下载各种类型的文件是一个比较常用的功能,这篇文章就是告诉您如何创建一个.txt文件并让用户下载。 使用代码 虽然在示例里,我先创建了一个text文件,但是你不一定也要这么做,因为这个文件可能在你的网站里已经存在了。如果是这样的话,你只需要使用FileStream去读取它就可以了。 首先,我们将这个text文件读取到一个byte数组中,然后使用Response对象将文件写到客户端就可以了。 Response.AddHeader("Content-disposition", "attachment; filename=" + sGenName); Response.ContentType = "application/octet-stream"; Response.BinaryWrite(btFile); Response.End(); 这段代码是完成这个功能的主要代码。第一句在输出中添加了一个Header,告诉浏览器我们发送给它的是一个附件类型的文件。然后我们设置输出的ContentType是"application/octet-stream",即告诉浏览器要下载这个文件,而不是在浏览器中显示它。 下面是一个MIME类型的列表。 ".asf" = "video/x-ms-asf" ".avi" = "video/avi" ".doc" = "application/msword" ".zip" = "application/zip" ".xls" = "application/vnd.ms-excel" ".gif" = "image/gif" ".jpg"= "image/jpeg" ".wav" = "audio/wav" ".mp3" = "audio/mpeg3" ".mpg" "mpeg" = "video/mpeg" ".rtf" = "application/rtf" ".htm", "html" = "text/html" ".asp" = "text/asp" '所有其它的文件 = "application/octet-stream" 下面是一个完整的如何下载文本文件的示例代码 C# protected void Button1_Click(object sender, EventArgs e) { string sFileName = System.IO.Path.GetRandomFileName(); string sGenName = "Friendly.txt"; //YOu could omit these lines here as you may not want […]
View DetailsIIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法 IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler” 解决方法如下: 以管理员运行下面的命令注册: 32位机器: C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i 64位机器: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i
View Details最近新换了系统还真是问题多多呀!! 系统更新补丁后打开 VS2012 ,新建C#项目的时候出现这个问题 VS2012 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDoc mentFactoryService 我勒个去,相当郁闷呀,赶紧百度,找到了下面两个解决方案: 方案一: 删除 kb2805222 .net4.5 framework 更新程序(控制面板->Windows Update->) 但是我这里没有这个更新 于是我采用第二套方案 方案二: 更新 (KB2781514) 下载网址:http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=36020 OK了!哈哈~~~~ from:http://www.cnblogs.com/csulennon/p/3709019.html
View Details打开 D:\Tomcat8027\conf\tomcat-users.xml 在tomcat-users节点里添加: <role rolename="tomcat"/> <role rolename="role1"/> <role rolename="admin-gui"/> <role rolename="manager-gui"/> <user username="tomcat" password="tomcat" roles="tomcat"/> <user username="both" password="tomcat" roles="tomcat,role1"/> <user username="role1" password="tomcat" roles="role1"/> <user username="admin" password="admin" roles="admin-gui,manager-gui"/> 重启tomcat,就可以用admin登录了。PS:其他用户也可以不要。
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创建迁移 首先,让我们创建一个MySql数据库“Laravel_db”。接下来打开app/config目录下的database.php文件。请确保default键值是mysql:
1 2 3 |
1 return array( 2 ... 3 'default' => 'mysql', |
然后输入你的数据库配置信息:
1 2 3 4 5 6 7 8 9 10 11 |
2 'connections' => array( 3 'mysql' => array( 4 'driver' => 'mysql', 5 'host' => '127.0.0.1', 6 'database' => 'laravel_db', //数据库名 7 'username' => 'root, //你的数据库用户 8 'password' => 'Your_Database_Password', //数据库登录密码 9 'charset' => 'utf8', 10 'collation' => 'utf8_unicode_ci', 11 'prefix' => '', 12 ), |
我们要使用Laravel命令行工具artisan来创建我们新的迁移。要运行astisan需要打开一个终端,切换路径到Laravel引用程序文件夹的更目录。 第一个我们需要做的就是安装migrations表,这样Laravel就可以追踪哪些迁移已经运行了。下面的命令将会在数据库中创建一个特殊的表:
1 |
1 php artisan migrate:install |
如下: 如果创建成功,artisan会返回“Migration table created successfully.”。 查看数据库,你会发现artisan确实创建了一个新表“migrations”。 你不需要过于关注这个表。这只是一个帮助Laravel监视迁移的表。当你添加新的迁移,artisan migrate会检查migrations表并执行那些没有运行的迁移。 现在,让我们创建一个实际的迁移文件。我想创建一个名为“author”的新表。让我们运行artisan migrate:make命令:
1 |
1 php artisan migrate:make create_authors_table |
运行截图如下: 你会在app/database/migrations目录下看到文件2014_03_11_162133_create_authors_table.php。 正如你看到的,一个新的迁移文件名称中包含时间戳和迁移的描述性名称。 [注]注意细节的读者可能会注意到我们用“authors”问不是“author”命名作者表。这是Laravel设计理念的一方面,使用自然模型帮助我们存储数据模型。Laravel的表应该始终命名为你的数据模型的复数形式。对于Author模型,表就被命名为“authors”。如果你有一个模型Car,你需要命名表为“Cars”。另外,SELECT name FROM authors WHERE id=100比SELECT name FROM author WHERE id=100更有意义。 迁移的解剖 迁移是Illuminate\Database\Migrations\MigrationLaravel 类的子类。您创建的类必须至少包含类的两个方法up()和down()。下面是生成由artisan的骨架迁移类:
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 |
1 <?php 2 use Illuminate\Database\Schema\Blueprint; 3 use Illuminate\Database\Migrations\Migration; 4 5 class CreateAuthorsTable extends Migration { 6 7 /** 8 * Run the migrations. 9 * 10 * @return void 11 */ 12 public function up() 13 { 14 // 15 } 16 17 /** 18 * Reverse the migrations. 19 * 20 * @return void 21 */ 22 public function down() 23 { 24 // 25 } 26 } |
使用Laravel,我们可以在任何时间迁移到数据模型的特定版本。Up()方法中的代码执行向前迁移,down()执行反向迁移(创建数据库的新版本或者回滚到前一个版本)。 很容易想到up()执行迁移文件操作,down()是完全相反。就像word文档中的撤销命令——撤销所做的修改。例如,我们想创建一个“authors”表,在up()中创建,在down()中撤销。让我们看看应该怎么做。 Artisan migrate:make命令有一些可以加快你工作流的其他选项。让我们运行下面命令:
1 |
1 php artisan migrate:make create_authors_table --table authors --create |
在上面的例子中,我们使用—table选项指定表名。另外,我添加了—create选项去告知artisan这个表需要被创建。如果我们打开迁移文件,你会发现artisan为我们生成了额外的样板文件代码:
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 |
1 <?php 2 use Illuminate\Database\Schema\Blueprint; 3 use Illuminate\Database\Migrations\Migration; 4 5 class CreateAuthorsTable extends Migration { 6 7 /** 8 * Run the migrations. 9 * 10 * @return void 11 */ 12 public function up() 13 { 14 Schema::table('authors', function(Blueprint $table) 15 { 16 // 17 }); 18 } 19 20 /** 21 * Reverse the migrations. 22 * 23 * @return void 24 */ 25 public function down() 26 { 27 Schema::table('authors', function(Blueprint $table) 28 { 29 // 30 }); 31 } 32 } |
非常棒!现在,让我们做更加具体的工作。我们要使用的 Laravel Schema类来创建我们的"Authors"表。下面是创建作者表,并将必要的列添加到表的迁移代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
1 public function up() 2 { 3 Schema::create('authors', function(Blueprint $table) 4 { 5 // auto increment id (primary key) 6 $table->increments('id'); 7 8 $table->string('name'); 9 $table->integer('age')->nullable(); 10 $table->boolean('active')->default(1); 11 $table->integer('role_id')->unsigned(); 12 $table->text('bio'); 13 14 // created_at, updated_at DATETIME 15 $table->timestamps(); 16 }); 17 } |
我们调用Schema::create()方法创建一个新表“authors”。Schema::create()方法有两个参数:表名和一个闭包,闭包中包含了列定义。 闭包中,我们可以使用$table参数创建列。列定义方法的基本结构是:
1 |
1 $table->column_type(column_name) |
列类型 在前面的示例中,我们指定的名称列的类型为"string"。但这是什么意思?数据库中通常没有”string”类型的列。 请记住,Laravel 试图使您的应用程序独立于底层的数据库;例如,如果你想,你可以使用 MySql 开发并部署到 Postgresql。如果您在迁移中使用 MySql 的列类型,应用到 Postgres 数据库可能无法工作。所以,Laravel 迁移通过使用通用的数据类型使你与底层的数据库类型系统隔离。如果我们要迁移 MySql 数据库, string()方法将创建VARCHAR(255)类型的列。在 Postgres,同一迁移可能会添加CHAR VARYING(255)类型的列 (虽然VARCHAR类型支持所有主要的数据库平台)。 Laravel 直接支持以下数据类型: Laravel 方法 列的类型 increments($column) 向表中添加自动递增的主键 string($column) 添加一个VARCHAR(255)列 string($column, $length) 添加具有长度的VARCHAR integer($column) 向表中添加一个INTEGER列, float($column) 向表中添加一个FLOAT的列 decimal($column, $precision, $scale) […]
View Details该章节内容翻译自《Database Migration using Laravel》,一切版权为原作者。 原作者:Stable Host, LLC 翻译作者:Bowen Huang 正文: Laravel鼓励敏捷、迭代的开发方式,我们没指望在第一次就获得所有正确的。相反,我们编写代码、测试和与我们的最终用户进行交互,并完善我们的理解。 对于工作,我们需要一个配套的实践集。我们使用像subversion、GIT或Mercurial这些版本控制工具来存储应用程序的源代码文件,使我们能够撤消错误和追踪开发过程中的改变。 但应用程序更改时,存在我们不能单独使用版本控制进行有效管理的区域。在我们的开发进度中,Laravel应用程序的数据库架构不断演变:我们在这里添加了一个表,在那里重命名列,删除索引等等。数据库的改变与应用程序代码步调一致。 你需要一个复杂的方法来跟踪您的数据库架构更改,通常有几种方法: 当您在开发团队内工作时,每人都需要知道关于任何架构的更改。 当你在生产服务器上部署时,您需要有稳健的方式来升级您的数据库架构。 如果您在多台机器上工作,你需要保持所有数据库架构的同步。 如果没有严格的约定和纪律让应用程序开发者遵循,保持数据库架构与应用程序代码同步历来是一个非常麻烦的工作。开发者(或数据库管理员) 进行所需的架构更改。但是,如果应用程序代码回滚到以前的版本,但是很难撤消数据库架构更改,照成数据库版本信息与应用程序代码版本信息不一致。 迁移就是帮助你进化你的应用程序数据架构的Laravel方式,它不需要你在每次改变的时候删除或者重建数据库。没有删除和重建就意味着你不会在每次改变的时候丢失数据。当你执行迁移时唯一的改变就是将数据库架构从一个版本移到另一个版本,不管是向前还是向后移。 Laravel迁移给你提供了一种在迭代方式中修改数据库架构的手段,它不要你用SQL操作,而是允许你使用PHP代码。Laravel架构生成器允许我们快速创建数据库表和插入列或索引。它使用清洁和富有表现力的语法来操作数据库。你也许为认为Laravel迁移就是数据库的版本控制。 通过定义一个更高级别的接口来创建和维护数据库架构,你可以用与数据库无关的方式定义它。通过使用 PHP 来创建表,定义列和索引,写一次架构并将其应用到任何所支持的数据库后端。额外的好处是 ,Laravel 跟踪已经应用了哪些迁移和哪些仍需要应用。 迁移基础知识 一个Laravel迁移仅仅是你应用程序app/database/migrations目录下的PHP源文件。每个文件都包含了对底层数据库的一组改变。对数据库的改变是在PHP代码中而不是数据库特定的SQL。你的PHP迁移代码最终被转换成符合你当前数据库的DDL,这使得切换数据库平台非常的容易。由于迁移代码保存在自己的目录中,就务必要像其他的项目代码一样包含到版本控制里面。Laravel迁移是使用Artisan工具用命令行显示运行的。 迁移文件命名约定 在旧版本Laravel的,迁移的文件有比较简单的名字,如001_create_employees_table.php 。 Laravel 3(Laravel 4.1和其相同)带来了新的命名约定,其中名称的第一部分从一个序列号变更为更长的时间,像2014_03_11_032903_create_employees_table.php。该文件的名称的形式YYYY_MM_DD_HHMMSS_some_meaningful_name.php的,也就是说一个UTC时间戳识别后跟一个迁移名。 新的更宽的名字有助于避免名称冲突,如果你是工作在一个团队里的一个开发人员,你可以检查自己的迁移。 此外, Laravel迁移文件的时间戳,以便他们可以顺序执行。时间戳数字是迁移的关键,因为它们定义了哪一个迁移应用在独立迁移版本号的顺序。 想SQL脚本,迁移从顶部开始执行,这更加需要这些文件才能被执行。顺序执行移除了类似这样的可能性——在表不存在的时候尝试插入列。 尽管你可以手动创建迁移文件,但是使用Artisan工具生成迁移脚本更加的容易(并且不易出错)。你可以根据需要在以后编辑这些文件。 运行迁移Forward 和 Backward 使用Artisan工具迁移到数据库。Laravel提供了一套artisan任务,可以归结为运行特定的几套迁移。 [注]你可以运行artisan list同查看artisan支持的任务列表,大多数数据迁移相关的任务都带有前缀migrate:。 只有几个你需要知道的常见任务: migrate:install 你第一次使用的与迁移有关的artisan任务可能就是migrate:install。在内部,Laravel使用特殊的表来跟踪哪些迁移已经运行。若要创建此表,只需要用artisan命令行工具: $php artisan migrate:install migrate 你将会运行migrate任务频繁的更新你的数据库,以支持你添加到应用程序中的最新的表和列。最基本的形式,它只会对那些所有没有被运行过的迁移运行up()方法。如果没有这样的迁移,会退出。它将基于迁移的日期来运行这些迁移。 migrate:rollback 在写迁移时偶尔也会犯错误。如果你已经运行了迁移,那么你不能只是编辑迁移和再次运行迁移:Laravel假定它已经运行了迁移,那么当你再次运行artisan migrate,不会做任何事情。你必须使用artisan migrate:rollback回滚迁移,然后编辑迁移,再运行artisan migrate去运行正确的版本。 一般情况下,编辑现有的迁移不是好主意:你和你的同事将会需要额外的工作,并且这是一件让人头痛的事——如果现存版本的迁移已经运行在生产机器上。相反,你需要写一个新的迁移去执行所需的改变。 [注]artisan migrate:rollback 会删除上次的迁移应用。Laravel回去整个迁移“操作”。因此,如果上次的迁移命令运行了15个迁移,这15个迁移都会被回滚。请注意,当你删除列或者表,会丢失数据。 migrate:reset 回滚所有的迁移(会删掉所有表和数据) migrate:refresh artisan migrate:refresh任务将删除数据库、 重新创建它并将加载当前架构。这是一个方便快捷方式去运行重置并随后重新运行所有迁移。 migrate:make artisan migrate:make命令告诉 Laravel 来生成一个迁移文件骨架 (这是实际上是一个 PHP 文件) ,存放到app/database/migrations文件夹中。然后,您可以编辑此文件来充实您的表/索引定义。然后,artisan migrate命令运行时,artisan会查询此文件来生成 SQL DDL 的实际代码。 接下来会详细描述数据库迁移 未完待续…… from:http://www.cnblogs.com/huangbx/p/Laravel_3.html
View Details