4

私は、アプリケーションのユーザー管理を作成するタスクを割り当てられたプロジェクトに取り組んでいます。しかし、私はテーブルの関係とそれらの移行にこだわっています。

努力

私はこれらのテーブルを持っています:

  1. ユーザー
    • ユーザーID
    • ユーザー名
    • パスワード
  2. プロファイル
    • profile_id
    • ユーザーID
    • ファーストネーム
    • 苗字
    • Eメール
  3. 住所

    • address_id
    • profile_id
    • 住所
    • ピンコード
  4. 構成
    • config_id
    • 構成名
    • 構成タイプ
    • 親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エラーが発生します:

移行エラー.

その方法を教えてください。同じテーブル構造を使用する必要があり、変更できません。さらに更新が必要な場合、または何かを忘れた場合はお知らせください。

4

1 に答える 1

2

これは、移行が構成の前にアドレステーブルを移行しようとするため、config_id参照されている外部キーが見つからないため、移行ファイルの名前を変更してから、migrationcommadでconfigurations_tableまず移行ファイルを渡し、次に移行ファイルを渡すことができるaddresses_tableためです。変化する :

2016_02_26_104519_create_configurations_table.php

に :

2016_02_26_102005_create_configurations_table.php
_____________^

その後、optimize コマンドを実行して、最適化されたクラス ローダーを再生成する必要があります。

php artisan o

そしてphp artisan migrate、コマンドを再実行して、問題を解決する必要があります。

お役に立てれば。

于 2016-02-26T12:17:33.427 に答える