'How to create foreign keys in Laravel without errors

I'm trying to create foreign keys in Laravel. However, when I migrate my table using Artisan, I am thrown the following error.

Schema::create('billing_transactions', function (Blueprint $table) {
    $table->id();
    $table->integer('payment_amount')->default(0);
    $table->tinyInteger('status')->default(0);
    $table->foreignIdFor(PatientVisit::class)->nullable()->constrained()->onDelete('cascade')->onUpdate('cascade');
    $table->foreignIdFor(BillingInvoice::class)->nullable()->constrained()->onDelete('cascade')->onUpdate('cascade');
    $table->foreignId('created_by_id')->nullable()->constrained('users')->onDelete('cascade')->onUpdate('cascade');
    $table->foreignId('updated_by_id')->nullable()->constrained('users')->onDelete('cascade')->onUpdate('cascade');
    $table->timestamps();
});

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table billing_transactions add constraint billing_transactions_billing_invoice_id_foreign foreign key (billing_invoice_id) references billing_invoices (id) on delete cascade on update cascade)



Solution 1:[1]

    /**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->BigInteger('role_id')->unsigned();
        $table->BigInteger('lang_id')->unsigned()->nullable();
        $table->BigInteger('reference_id')->unsigned()->nullable()->default(null);
        $table->string('name');
        $table->string('surname');
        $table->boolean('blocked')->default(0);
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
    Schema::table('users', function($table) {
        $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
        $table->foreign('lang_id')->references('id')->on('languages')->onDelete('cascade');
        $table->foreign('reference_id')->references('id')->on('users')->onDelete('cascade');

    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('users', function($table) {
        $table->dropForeign(['role_id']);
        $table->dropColumn('role_id');
        $table->dropForeign(['lang_id']);
        $table->dropColumn('lang_id');
        $table->dropForeign(['reference_id']);
        $table->dropColumn('reference_id');
        $table->dropUnique(['email']);
        $table->dropColumn('email');
    });
    Schema::dropIfExists('users');
}

I use like that. For foreigns and uniques.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Deniz Gölbaş