Как создать один и тот же foriegn_key для двух или нескольких идентификаторов таблиц в laravel - PullRequest
0 голосов
/ 16 апреля 2019

В моем проекте у меня есть таблица журналов, таблица ежемесячников, таблица ссуд, таблица инвестиций. В журнальной таблице есть payment_id, который я хочу дать внешний ключ для идентификатора ежемесячных таблиц, ссуд и инвестиций. Я пробовал это, но при миграции возникает ошибка «дубликат ключа при записи или обновлении»

я хочу вставить идентификатор ссуды, инвестиций, месячных в таблицу журналов payment_id при создании ссуды, инвестиций, ежемесячных платежей. Я могу вставить только один идентификатор таблицы в таблицу журналов payment_id (через отношение внешнего ключа в миграции), а не несколько ... как это сделать?

public function up()
{
    Schema::create('journals', function (Blueprint $table) {
        $table->increments('id');
        $table->double('amount');
        $table->integer('payment_id')->unsigned();
        $table->enum('payment_format', ['monthly', 'investment', 'loan', 'income', 'expense', 'others']);
        $table->string('short_description');
        $table->integer('created_by')->unsigned();
        $table->integer('updated_by')->unsigned();
        $table->dateTime('deleted_at');
        $table->timestamps();

        $table->foreign('payment_id')->references('id')->on('monthlies')
            ->onUpdate('cascade')->onDelete('cascade');

        $table->foreign('payment_id')->references('id')->on('investments')
            ->onUpdate('cascade')->onDelete('cascade');
        $table->foreign('payment_id')->references('id')->on('loans')
            ->onUpdate('cascade')->onDelete('cascade');

        $table->foreign('created_by')->references('id')->on('users')
            ->onUpdate('cascade')->onDelete('cascade');
        $table->foreign('updated_by')->references('id')->on('users')
            ->onUpdate('cascade')->onDelete('cascade');

    });
}

1 Ответ

0 голосов
/ 16 апреля 2019

Вы не можете сделать это в Laravel.Этот же столбец нельзя использовать в качестве внешнего ключа для 3 других таблиц.Однако вы можете сделать это в Laravel без использования внешних ключей на уровне базы данных.

Ваша миграция:

Schema::create('journals', function (Blueprint $table) {
    $table->increments('id');
    $table->double('amount');
    $table->integer('payment_id')->unsigned();
    $table->enum('payment_format', ['monthly','investment','loan','income','expense','others']);
    $table->string('short_description');
    $table->integer('created_by')->unsigned();
    $table->integer('updated_by')->unsigned();
    $table->dateTime('deleted_at');
    $table->timestamps();

    $table->foreign('created_by')->references('id')->on('users')
        ->onUpdate('cascade')->onDelete('cascade');
    $table->foreign('updated_by')->references('id')->on('users')
        ->onUpdate('cascade')->onDelete('cascade');

});

В вашей модели Journal определите отношение к вашему платежу:

public function payment() {
    switch($this->payment_format) {
        case 'loan':
            return $this->belongsTo(Loan::class, 'payment_id');
        case 'monthly':
            return $this->belongsTo(Monthly::class, 'payment_id');
        case 'investment':
            return $this->belongsTo(Investment::class, 'payment_id');
        default:
            // ??
            break;
    }
}

Теперь, вызвав $journal->payment, вы получите правильный объект на основе значения в вашем поле payment_format.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...