如何在 Laravel 5 中创建表迁移

Posted

技术标签:

【中文标题】如何在 Laravel 5 中创建表迁移【英文标题】:How to create table migration in Laravel 5 【发布时间】:2016-06-09 14:52:52 【问题描述】:

我正在从事一个项目,我被分配了一项任务来为应用程序创建用户管理。但我一直坚持表关系及其迁移。

努力

我有这些表:

    用户 user_id 用户名 密码 个人资料 profile_id user_id 名字 姓氏 电子邮件

    地址

    address_id profile_id 地址 城市 状态 国家 密码 配置 config_id 配置名称 配置类型 parent_id

现在我必须为上述相同的结构创建模型和迁移。为此,我创建/修改了以下模型和迁移类。

模型:用户

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'username', 'password',
    ];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    public function profile()
    
        return $this->hasOne('Profile','user_id');
    

迁移:2014_10_12_000000_create_users_table.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('user_id');
            $table->string('username');
            $table->string('password', 60);
            $table->rememberToken();
            $table->timestamps();
        );
    

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

型号:简介

use Illuminate\Database\Eloquent\Model;

class Profile extends Model

    public function user()
        return $this->belongsTo('User');
    
    public function address()
    
        return $this->hasOne('Address','address_id');
    

迁移:2016_02_26_101749_create_profiles_table.php

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

class CreateProfilesTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('profiles', function (Blueprint $table) 
            $table->increments('profile_id');
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('user_id')->on('users')->onDelete('cascade');
            $table->string('lastname')->nullable();
            $table->string('firstname')->nullable();
            $table->string('gender')->nullable();
            $table->string('email')->unique();
            $table->string('phonenumber', 20)->nullable();
            $table->timestamps();
        );
    

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

型号:地址

namespace App;

use Illuminate\Database\Eloquent\Model;

class Address extends Model

    public function profile()
        return $this->belongsTo('Profile');
    

    public function city() 
        return $this->hasOne('Configuration', 'config_id');
    

    public function state() 
      return $this->hasOne('Configuration', 'config_id');
    

    public function country() 
        return $this->hasOne('Configuration', 'config_id');
    

迁移:2016_02_26_102805_create_addresses_table.php

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

class CreateAddressesTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('addresses', function (Blueprint $table) 
            $table->increments('address_id');
            $table->integer('profile_id')->unsigned();
            $table->foreign('profile_id')->references('profile_id')->on('profiles')->onDelete('cascade');
            $table->string('address')->nullable();
            $table->integer('city')->unsigned();
            $table->foreign('city')->references('config_id')->on('configurations')->onDelete('cascade');
            $table->string('pincode')->nullable();
            $table->integer('state')->unsigned();
            $table->foreign('state')->references('config_id')->on('configurations')->onDelete('cascade');
            $table->integer('country')->unsigned();
            $table->foreign('country')->references('config_id')->on('configurations')->onDelete('cascade');
            $table->timestamps();
        );
    

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

型号:配置

namespace App;

use Illuminate\Database\Eloquent\Model;

class Configuration extends Model

    public function children() 
        return $this->hasMany('Configuration','parent_id');
    
    public function parent() 
        return $this->belongsTo('Configuration','parent_id');
    
   public function address()
        return $this->belongsTo('Address');
    

迁移:2016_02_26_104519_create_configurations_table.php

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

class CreateConfigurationsTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('configurations', function (Blueprint $table) 
            $table->increments('config_id');
            $table->string('configuration_name');
            $table->string('configuration_type');
            $table->string('parent_id');
            $table->timestamps();
        );
    

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

现在,当我运行 php artisan migrate 时,我收到以下错误:

.

请建议我如何做到这一点。我必须使用相同的表结构并且不能修改它。如果有任何进一步的更新需要或我忘记了什么,请告诉我。

【问题讨论】:

我在迁移表中创建了 user_id 而不是 id。所以,我认为这不是问题。我认为问题在于地址和配置,因为地址包含城市、州、国家列,这些列将是配置表中的外键。 是的,很抱歉,我在user 表中发布了您的列名称为user_id 的评论后才意识到 - 让我困惑了一会儿。我删除了评论。 单独运行迁移,看看是哪一个给了你错误。 好的,我试试。我已经尝试过,但我没有找到任何东西可以为每个表运行单独的迁移。请建议我如何为每个模型单独运行迁移。 【参考方案1】:

发生这种情况是因为迁移将在配置之前尝试迁移地址表,因此它不会找到您引用的外键 config_id,因此您可以更改迁移文件的名称,然后 migration 逗号可以传递 @首先是 987654323@ migrate 文件,然后是 addresses_table migrate 文件,所以只需更改:

2016_02_26_104519_create_configurations_table.php

收件人:

2016_02_26_102005_create_configurations_table.php
_____________^

之后你应该运行优化命令来重新生成优化的类加载器:

php artisan o

然后重新运行php artisan migrate 命令现在问题应该解决了。

希望这会有所帮助。

【讨论】:

是的,它解决了我的问题。你能告诉我是我的模特,他们的关系还可以吗。 不确定,我第一次看到同一列 (config_id) 代表不同的信息(城市、州、国家/地区),不确定它是否有效。

以上是关于如何在 Laravel 5 中创建表迁移的主要内容,如果未能解决你的问题,请参考以下文章

如何从迁移中创建 Laravel 模型?

如何在 Laravel 迁移中创建自引用关系(外键)?

如何在 MySQL 中创建表别名

如何使用一个命令在 laravel 中创建所有三个文件(控制器、模型和数据库迁移文件)

如何在Laravel中创建唯一索引?

在迁移 laravel 5.2 中创建数据库视图