1

「goals」と「partgoals」という 2 つのテーブルを持つデータベースを作成しました。実際の使用法は、貯蓄目標 (お金) を作成し、途中でマイルストーン (部分目標) を設定することです。部分的な目標が明らかに特定の目標にリンクされていることを望みます。リレーションシップは作成されますが、シード データを作成しようとすると問題が発生します。

私の目標は、次のような 2 つの目標テーブルを設定することです (GoalsTableSeeder.php):

<?php

class GoalsTableSeeder extends Seeder {

    public function run()
    {
        DB::table('goals')->delete();


        $goals = array(
            array(
                'max'      => 1850000,
                'avgsav' => 3500,
                'duedate'  => date('2015-03-15'),
                'created_at' => new DateTime,
                'updated_at' => new DateTime,
            ),
            array(
                'max'      => 1100000,
                'avgsav' => 5000,
                'duedate'  => date('2013-11-15'),
                'created_at' => new DateTime,
                'updated_at' => new DateTime,
            )
        );

        DB::table('goals')->insert( $goals );
    }

}

私の partgoals テーブルは次のようになります (PartgoalsTableSeeder.php):

<?php

class PartgoalsTableSeeder extends Seeder {

    public function run()
    {
        DB::table('partgoals')->delete();


        $partgoals = array(
            array(
                'id' => 1,
                'milestone'      => 100000,
                'duedate'  => date('2014-03-15'),
                'created_at' => new DateTime,
                'updated_at' => new DateTime,
            ),
            array(
                'id' => 1,
                'milestone'      => 20000,
                'duedate'  => date('2013-06-15'),
                'created_at' => new DateTime,
                'updated_at' => new DateTime,
            ),
            array(
                'id' => 2,
                'milestone'      => 400000,
                'duedate'  => date('2013-09-15'),
                'created_at' => new DateTime,
                'updated_at' => new DateTime,
            ),
            array(
                'id' => 2,
                'milestone'      => 200000,
                'duedate'  => date('2014-10-15'),
                'created_at' => new DateTime,
                'updated_at' => new DateTime,
            )
        );

        DB::table('partgoals')->insert( $partgoals );
    }

}

「目標」の移行テーブル:

<?php

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

class CreateGoalsTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('goals', function(Blueprint $table)
        {
            $table->increments('id');
            $table->integer('max');
            $table->float('avgsav');
            $table->date('duedate');
            $table->timestamps();
        });
    }

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

}

partgoals の移行テーブル:

<?php

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

class CreatePartgoalsTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('partgoals', function(Blueprint $table)
        {
            $table->foreign('id')
                ->references('id')->on('goals')
                ->onDelete('cascade');
            $table->increments('id');
            $table->float('milestone');
            $table->date('duedate')->nullable();
            $table->timestamps();
        });
    }

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

}

私は何を間違っていますか?私はLaravel(およびLaravel 4)が初めてです。

4

4 に答える 4

4

コードにいくつか問題があります。

1)外部キーの作成方法
外部キー制約を割り当てるときは、その列を作成する必要がありますunsignedInteger
以下のコードでは、2 つの列に 'id' という名前を付けた間違いを修正します

Schema::create('partgoals', function(Blueprint $table)
    {
        $table->increments('id');        
        $table->unsignedInteger('goal_id');
        $table->foreign('goal_id')
            ->references('id')->on('goals')
            ->onDelete('cascade');
        $table->float('milestone');
        $table->date('duedate')->nullable();
        $table->timestamps();
    });


2)データベースをシードする方法
外部キーを指定する場合は、テーブル シーダーでエントリを作成するときに値を宣言する必要があります。
値を指定したい場合はNULL、列がそのような値を受け入れることを許可することでこれを行うことができます (デフォルトでは受け入れません)。この場合、追加する必要があります->nullable()->default(NULL)

Schema::create('partgoals', function(Blueprint $table)
    {
        $table->increments('id');        
        $table->unsignedInteger('goal_id')->nullable()->default(NULL);
        $table->foreign('goal_id')
            ->references('id')->on('goals')
            ->onDelete('cascade');
        $table->float('milestone');
        $table->date('duedate')->nullable();
        $table->timestamps();
    });

軽微なミス3)シーダーで 2 回
パスしています'id' => 1

于 2013-10-16T10:04:10.683 に答える
1

クエリビルダーで使用incrementsすると、自動的に主キー、自動インクリメント、および一意になります。1 対 1 の関係でない限り、外部キーを主キーにすることはできません。それはただ悪いデザインです。スキーマは次のようになります。

Schema::create('partgoals', function(Blueprint $table)
    {
        $table->increments('id');
        $table->foreign('goal_id')
            ->references('id')->on('goals')
            ->onDelete('cascade');
        $table->float('milestone');
        $table->date('duedate')->nullable();
        $table->timestamps();
    });

また、シードinsertGetId時に挿入時に を使用すると、挿入したレコードの ID が返されます。これは、後で別のテーブルに挿入するなど、別の挿入で使用できます。ただし、これは同じスクリプト内で行う必要があります。それを別のシード スクリプトに渡してから別のシード スクリプトに戻すことができるかもしれませんDatabaseSeederが、私はこれを試していません。

于 2013-07-10T20:37:07.587 に答える
0

私はLaravelやあなたがやろうとしていることに精通していませんが、コメントに追加したエラーに基づいて、あなたの問題は同じ主キー(1)を持つ複数のレコードをあなたのpartgoalsテーブル。

テーブルをどのように設定したかはわかりませんが、テーブルを参照するための外部キーとしても使用しようとしているpartgoals、一意の主キー列を持つテーブルを定義したようです。テーブルに外部キーを保持する別のフィールドを作成する価値があるかもしれません。IDgoalspartgoals

于 2013-06-30T22:36:58.677 に答える