laravel数据库迁移相关

iseed用法

导出单个表的数据

比如我要表某个表的数据导出到seed文件,那么命令为:php artisan iseed 你要转换的表名

假如说我要用户表的数据导出,命令应该是:

php artisan iseed users

导出多个表的数据

和导出单个类似,多个表用逗号隔开

php artisan iseed 表1,表2

导出数据并且强制覆盖

有时候我们导出的时候,这个seed文件已经存在了,我们要覆盖它,要怎么做呢

很简单,其他不变,只需要在命令中加入--force就OK了,

php artisan iseed 表名1[,表名2...]--force

导出指定的数据库里指定的表,并生成seed文件

php artisan iseed 表名--database=数据库名

使用cmd命令创建模型到指定目录

 php artisan make:model Models/Log/DecryptLog

php artisan make:controller Api/DecryptLogController

ENGINE=InnoDB

1、MySQL默认采用的是MyISAM。

2、MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。

3、InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。

4、 InnoDB支持外键,MyISAM不支持。

5、InnoDB的主键范围更大,最大是MyISAM的2倍。

6、InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。

7、MyISAM支持GIS数据,InnoDB不支持。即MyISAM支持以下空间数据对象:Point,Line,Polygon,Surface等。

8、没有where的count(*)使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count(*)时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count(*)的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大???

在你的 composer.json 中增加 doctrine/dbal 依赖

在cmd中一行代码就可以了:

composer require doctrine/dbal

 

Doctrine和dbal的关系

Doctrine是基于数据库抽像层上的ORM,它可以通过PHP对象轻松访问所有的数据库,例如MYSQL

Doctrine DBAL是一个轻量级的类似于PDO的数据库抽象接入层。它是一个面向对象的架构,需求PHP5.3版本的支持,因为它的实现用到了命名空间。除了类似于PDO的操作外,它允许人们定制属于自己的数据库支持。DBAL能够被用于ORM,这在Doctrine ORM项目中有体现。

 

ORM也是基于DBAL的,DBAL提供了一个统一的基于pdo的接口,主要使用方式是使用QueryBuilder或者直接执行原生sql,ORM是在它基础上使用对象来映射表数据和关联关系,以及接口更丰富的QueryBuilder和DQL,所以看使用场景来决定使用哪个效率更高。

 

Laravel 实践之路: 数据库迁移与数据填充

数据库迁移实际上就是对数据库库表的结构变化做版本控制,之前对数据库库表结构做修改的方式比较原始,比如说对某张库表新增了一个字段,都是直接在库表中执行alter table xxx add .. 的方式直接修改,但是这么做有些弊端,比如在开发阶段,你自己的库表修改了,还要把这句sql语句传给别人再执行一遍,这在多人协同开发时不是一种好的方式.那有没有一种方式能让我们对数据库 库表的修改做一些简单的版本控制,同时能让其他人很方便的同步我们对数据库的修改呢? 答案是我们可以使用Laravel 内置的Migrations .

对数据库的管理包括哪些部分?

其实Laravel对数据库的版本管理主要包括两部门: 数据库结构的管理 和数据的管理.

数据库结构的管理: 主要是对数据库结构进行管理,比如新增了一张表,某张表增加了一个字段等等.

数据的管理: 这个主要是管理表中的数据,生成一些填充数据,解决我们开发调试时没有测试数据的问题.

数据库结构管理

要记录下我们对数据库结构所做的更改,我们可以使用Laravel内置 Migrations.

下面我们就走个小例子,看看如果要在数据库中新增一个库表具体该怎么做:

1. 创建一个数据库

Laravel要和我们的数据库连接,首先要有个对应的数据库,你可以在PHPMyAdmin或者navicat for mysql 等管理工具新建一张表:

CREATE DATABASE `laravel5`;

2. 配置数据库的连接信息

我们要使用Laravel管理数据库,第一步当然是要能连接上数据库,数据库的连接配置信息是放在根目录下的.env文件中,这里我连接的是本地的数据库:

DB_CONNECTION=mysql

DB_HOST=127.0.0.1

DB_PORT=3306

DB_DATABASE=laravel5

DB_USERNAME=root

DB_PASSWORD=123456

3. 安装Laravel的Migrations

如果我们是第一次使用Migrations,那就要先执行migrate:install命令来支持数据库的迁移,进入到项目的根目录,执行安装命令:

php artisan migrate:install

这句话执行了以后,Laravel会在数据库新建一张migrations表,用这张表来记录我们每次对数据库做的更改:

 

4. 创建迁移文件

以上三步是我们在首次使用Migrations是需要做的,相当于初始化工作,以后每次的更改只需要做下面的工作,好,我们接着往下走.我们的目标是创建一张表,比如说就创建一张商品表goods,首先我们用artisan命令来创建一个对应的迁移文件:

php artisan make:migration create_goods_table --create=goods

执行信息如下:

Created Migration: 2017_03_05_214805_create_goods_table

这句话解释一下, make:migration 是迁移命令,create_goods_table 是迁移文件的文件名,--create=goods是该命令携带的参数,意思是创建一张表,并且表名是goods,这句话执行完毕以后, 我们可以在database\migrations目录下看到多个一个文件:

 

5. 编辑迁移文件:

我们首先看一下这个文件的结构,

解释一下这个文件:

该文件包括两个函数,up和down,up方法是当执行迁移动作时要执行的方法,down方法是在进行数据库回滚的时候执行的方法,因此up和down是一对反方法,up要创建一张表,down就是要删除一张表,同理,当up中是新增一个字段时,down方法就是删除一个字段了.

我们再来看一下up方法中的内容

Schema::create('goods', function (Blueprint $table) {..}
这里调用Schema操作表的方法来创建表,第二个参数是一个闭包,$table可以用来定义数据库表的结构:

$table->increments('id');
创建一个自增长的字段,字段名默认叫id,当然你也可以改成其他名字.

$table->timestamps();
这里会在表中创建created_at 和 updated_at 字段.

我们所需要的当然不止这么简单,下面我们就增加一些我们需要的字段  Schema::create('goods', function (Blueprint $table) {

·  ·  $table->increments('id');

·  ·  $table->integer('goods_sn'); //商品货号

·  ·  $table->string('goods_name');//商品名

·  ·  $table->decimal('prize', 10, 2); //价格

·  ·  $table->timestamps();

·  ·  });

6. 执行迁移:

在执行迁移之前,还需要执行一个命令composer dump-autoload,这个命令的主要作用是让 composer 更新 autoload_classmap 的内容,包含到我们新建的文件,具体可参考下这篇文章深入 Composer autoload

composer dump-autoload

然后执行

php artisan migrate

输出结果为:

 

然后我们查看一下数据库,发现goods 表生成了!

 

同理,如果你想在这个表中新增一个字段,可以从第四步到第六步再走一遍,只不过这次不再是创建表,但是流程是一样的.

7. 数据库回滚:

有时候我们想撤销对数据库做的修改,比如上面新增了一张表,我现在想删除那张表怎么办,这个时候就可以使用migrations的回滚rollback命令:

php artisan migrate:rollback

注意,这个命令并不是回滚所有的migrate操作,而是回滚你上一次的操作,如果你想执行所有的回滚,可以使用reset命令,执行后会按照迁移文件的时间排序执行所有文件的down方法;

php artisan migrate:reset

.8重建整个数据库

使用refresh命令,可以回滚所有的操作,然后再次执行所有的迁移,实际就是按照时间排序执行所有的down方法,然后再执行所有的up方法;

php artisan migrate:refresh

数据填充

1. 生成Seeder文件:

现在我们已经建立起了数据库表的结构,但是现在表中并没有测试数据,如何制造一些假数据方便我们测试呢?在Laravel中我们可以Seeder+Faker来填充假数据;

假设我们想对goods表填充一些数据.我们第一步要做的工作是先有一个对应于goods表的Seeder文件,让我们通过命令生成一个:

php artisan make:seeder GoodsTableSeeder

执行完后会在database\seeds 目录下看到生成的GoodsTableSeeder文件:

<?php

 

use Illuminate\Database\Seeder;

 

class GoodsTableSeeder extends Seeder

{

    /**

     * Run the database seeds.

     *

     * @return void

     */

    public function run()

    {

        //

    }

}

可以看到,类中只有一个默认的run方法,这个run方法就是我们执行数据填充的地方.

2. 编辑Seeder文件:

2.1 简单的数据填充

我们先尝试着做一次最简单的数据填充,直接使用DB类来插入一条数据,编辑run方法:

    public function run()

    {

        DB::table('goods')->insert([

            'goods_sn' => 10001,

            'goods_name' => '加多宝凉茶',

            'prize' => 3.5

        ]);

}

现在说了半天数据并没有进入数据库啊!莫慌,就差最后一步了: 执行seed命令:

php artisan db:seed --class=GoodsTableSeeder

执行完之后,就会发现数据已经填充到数据库了:

2.2 使用模型工厂进行批量填充

上面我们简单插入了一条数据,但是明显不过瘾,如果我们想一次插入100条数据,总不能手写100遍吧,这个问题我们可以使用模型工厂来解决:
当然,使用模型工厂之前,必须要有个对应于goods表的一个Model类,让我们执行命令生成一个:

php artisan make:model Models\Good

生成的Model类 Good:

<?php

 

namespace App\Models;

 

use Illuminate\Database\Eloquent\Model;

 

class Good extends Model

{

    //表示对应于表goods

    protected $table = 'goods';

}

模型工厂对应于database\factories中的ModelFactory.php文件,在这个文件中,我们新增一段代码:

$factory->define(\App\Models\Good::class, function (\Faker\Generator $faker) {

    return [

        'goods_sn' => $faker->numberBetween(10001,20000),

        'goods_name' =>$faker->name,

        'prize' => $faker->numberBetween(20,50)

    ];

});

define 方法中第一个参数表示关联Good模型类,第二个参数传入的是$faker,Faker是一个开源类库,主要用于生成一些测试数据,比如电话号码,人名,IP地址等等,这里Laravel内置了Faker,因此可以直接使用.
在方法中,对应于每个必须的字段,填充上对应的值;

然后回到GoodsTableSeeder.php文件,编辑run方法:

public function run()

    {

        factory(Good::class)->times(10)->create(); //create()表示插入数据库中

        //factory(Good::class)->times(10)->make(); //make()表示只生成对象,不插入库表中

}

这里调用factory方法,times表示要执行的次数.之后执行命令:

php artisan db:seed --class=GoodsTableSeeder

2.4 单次执行全部seeder

上面的操作虽然可以完成对一张表批量插入多条数据,但是如果我有多个表都要进来批量插入数据,难道要执行多次db:seed xxx,当然不用这样,database\seeds目录下有个DatabaseSeeder.php文件,这个文件的作用就是对多个seeder进行管理的,在这里可以调用其他的字Seeder类,指定他们的执行顺序:

<?php

 

use Illuminate\Database\Eloquent\Model;

use Illuminate\Database\Seeder;

 

class DatabaseSeeder extends Seeder

{

    /**

     * Run the database seeds.

     *

     * @return void

     */

    public function run()

    {

        Model::unguard(); //解除模型的批量填充限制

        $this->call(UsersTableSeeder::class);

        $this->call(StatusesTableSeeder::class);

        $this->call(RolesTableSeeder::class);

        $this->call(AdminUsersTableSeeder::class);

        Model::reguard();

 

    }

}

然后我们再执行seed命令:

php artisan db:seed

这个命令的作用就是执行DatabaseSeeder 的run方法,因此只需要执行上面的命令,就可执行所有表的填充命令了!

其实还有个最为强大的命令:

php artisan migrate:refresh --seed

这个命令主要做了三件事:

执行所有的回滚,也就是migrations目录下所有文件的down方法,执行的时候按照时间顺序.

所有回滚执行完毕后,执行所有的迁移,也就是按照时间顺序执行所有的up方法.

执行所有的数据填充,也就是执行DatabaseSeeder 中的run方法.如果在run方法中没有调用其他的seeder,则这个seeder的run方法不会被执行.

定义路由在web.php中

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 ));

生成命令

要创建新命令,请使用Artisan命令。此命令将在目录中创建一个新的命令类。如果您的应用程序中不存在此目录,请不要担心,因为它将在您第一次运行Artisan命令时创建。生成的命令将包含所有命令上存在的默认属性和方法集:make:commandapp/Console/Commandsmake:command

php artisan make:command SendEmails

命令结构

产生你的命令后,应当填写signaturedescription类,这将使上显示您的命令时使用的特性list屏幕。handle执行命令时将调用该方法。您可以将命令逻辑放在此方法中。

我们来看一个示例命令。请注意,我们能够将所需的任何依赖项注入命令的构造函数或handle方法中。Laravel 服务容器将自动注入构造函数或handle方法中所有类型提示的依赖项:

关闭命令

基于闭包的命令提供了将控制台命令定义为类的替代方法。与路由闭包是控制器的替代方法相同,可以将命令闭包视为命令类的替代方法。在commands您的文件的方法中,Laravel加载文件:app/Console/Kernel.phproutes/console.php

<?phpnamespace App\Console\Commands;use App\User;use App\DripEmailer;use Illuminate\Console\Command;class SendEmails extends Command{

    /**

     * The name and signature of the console command.

     *

     * @var string

     */

    protected $signature = 'email:send {user}';

    /**

     * The console command description.

     *

     * @var string

     */

    protected $description = 'Send drip e-mails to a user';

    /**

     * The drip e-mail service.

     *

     * @var DripEmailer

     */

    protected $drip;

    /**

     * Create a new command instance.

     *

     * @param  DripEmailer  $drip

     * @return void

     */

    public function __construct(DripEmailer $drip)

    {

        parent::__construct();

        $this->drip = $drip;

    }

    /**

     * Execute the console command.

     *

     * @return mixed

     */

    public function handle()

    {

        $this->drip->send(User::find($this->argument('user')));

    }}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值