laravel - 使用现有数据创建新的迁移表

时间:2015-07-11 10:10:18

标签: php mysql laravel laravel-5 relational-database

我有一个用户表,在类型列中有两种类型'student'或'faculty'。 我想从教师和学生的用户表中创建两个不同的表...

我想为教师和学生创建两个模型,但我不能提前考虑如何为这些模型填充表格。

<?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('identif')->unique();
        $table->string('type');
        $table->string('email')->unique();
        $table->string('password', 60);
        $table->rememberToken();
        $table->timestamps();

        //Add Primary Key

    });
}

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

1 个答案:

答案 0 :(得分:1)

最简单的方法是运行原始查询并将数据从users表复制到其他2个表,如果您正在使用MySQL,那么以下内容可能会起作用:

DB::statement("INSERT INTO students (name, identif, email, password) SELECT (name, identif, email, password) FROM users WHERE type = ?", array('student'));

其他数据库应该提供类似的功能。

如果您不需要为这些记录运行Eloquent模型逻辑,那么上面就可以了。否则只需获取用户对象,创建新的Student或Faculty对象并保存新对象:

Users::all()->map(function($user) {
  if ($user->type == 'student') {
    Student::create($user->toArray());
  } else {
    Faculty::create($user->toArray());
  }
});

如果您希望每次创建Users对象时都创建一个新的Faculty对象,您可以使用Eloquent模型事件:

//User.php
protected static function boot() {
  parent::boot();

  static::created(function($user) {
    if ($user->type == 'student') {
      Student::create($user->toArray());
    } else {
      Faculty::create($user->toArray());
    }
  });
}