Laravel框架数据迁移和填充

一、数据迁移
1、使用 Artisan 命令make:migration来创建一个新的迁移:

php artisan make:migration create_users_table
// 可以使用 --path指定生成的目标路径
php artisan make:migration --path=app\providers create_users_table

// 还可以一次性创建Model和migration
// 下述命令会做两件事情:
// 在 app 目录下创建模型类 App\Post
// 创建用于创建 posts 表的迁移,该迁移文件位于 database/migrations 目录下。
php artisan make:model --migration Post

执行成功后会在database\migrations目录下生成如下格式的php文件
2016_05_05_060000_create_users_table.php

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {   // 创建表
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }
}

迁移的顺序跟生成迁移文件的时间有关系。如果要修改表结构,比如说添加某个字段,需要在创建表之后执行,
比如说为users表添加软删除(也就是添加deleted_at字段)

php artisan make:migration update_users_table

在生成的php文件中添加如下代码

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class UpdateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function(Blueprint $table){
            // 软删除
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function(){
            $table->dropSoftDeletes();
        });
    }
}

二、数据填充
要生成一个填充器,可以通过 Artisan 命令make:seeder。所有框架生成的填充器都位于database/seeders目录:

php artisan make:seeder UsersTableSeeder

在生成的UsersTableSeeder.php中

<?php

use Illuminate\Database\Seeder;

class UserTableSeeder extends Seeder{
    /**
     * 运行数据库填充
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => str_random(10),
            'email' => str_random(10).'@gmail.com',
            'password' => bcrypt('secret'),
        ]);
    }
}

在DatabaseSeeder类中,你可以使用call方法执行额外的填充类,

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {   // 取消批量插入限制
        Model::unguard();
        $this->call(UsersTableSeeder::class);
    }
}

最后执行

php artisan db:seed
// 指定某个表的类名
// 指定类名后不需要在DatabaseSeeder.php中添加call方法
php artisan db:seed --class=UsersTableSeeder

3、通过factory模型仓库填充

在DatabaseSeeder类中,run方法中使用call方法执行相应的填充类

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UsersTableSeeder::class);
        $this->call(TagsTableSeeder::class);
        $this->call(PostsTableSeeder::class);
    }
}

在database\factories\ModelFactory.php中定义仓库模型

<?php $factory->define(App\User::class, function (Faker\Generator $faker) { return [ 'name' => $faker->name, 'email' => $faker->safeEmail, 'password' => bcrypt(str_random(10)), 'remember_token' => str_random(10), ]; }); $factory->define(App\Post::class, function($faker) { $images = ['about-bg.jpg', 'contact-bg.jpg', 'home-bg.jpg', 'post-bg.jpg']; $title = $faker->sentence(mt_rand(3, 10)); return [ 'title' => $title, 'subtitle' => str_limit($faker->sentence(mt_rand(10, 20)), 252), 'page_image' => $images[mt_rand(0, 3)], 'content_raw' => join("\n\n", $faker->paragraphs(mt_rand(3, 6))), 'publish_at' => $faker->dateTimeBetween('-1 month', '+3 days'), 'meta_description' => "Meta for $title", 'is_draft' => false, ]; }); $factory->define(App\Tag::class, function($faker) { $images = ['about-bg.jpg', 'contact-bg.jpg', 'home-bg.jpg', 'post-bg.jpg']; $word = $faker->word; return [ 'tag' => $word, 'title' => ucfirst($word), 'subtitle' => $faker->sentence, 'page_image' => $images[mt_rand(0, 3)], 'meta_description' => "Meta for $word", 'reverse_direction' => false, ]; });

生成model

// 以Post举例
php artisan make:model Post

生成填充类

php artisan make:seeder PostsTableSeeder

在PostsTableSeeder.php中调用

<?php use App\Post; use App\Tag; use Illuminate\Database\Seeder; class PostsTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { Post::truncate(); $tags = Tag::lists('tag')->all(); DB::table('post_tag_pivot')->truncate(); factory(Post::class, 20)->create()->each(function($post) use($tags) { if (mt_rand(1, 100) <= 30) { return; } shuffle($tags); $postTags = [$tags[0]]; if (mt_rand(1, 100) <= 30) { $postTags[] = $tags[1]; } $post->syncTags($postTags); }); } }
<?php

use App\Tag;
use Illuminate\Database\Seeder;

class TagsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Tag::truncate();
        factory(Tag::class, 5)->create();
    }
}

如果想在执行填充入库前对数据模型中的某个属性进行相关的操作,可以在相应的模型中定义set(字段)Attribute方法

比如说对posts表中的字段content_raw进行操作,同时还可以在该方法中操作其他字段,如content_html字段

    public function setContentRawAttribute($value) {
        $markdown = new Markdowner();
        $this->attributes['content_raw'] = $value;
        $this->attributes['content_html'] = $markdown->toHTML($value);
    }

迁移并填充数据

php artisan migrate --seed
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值