Laravel-Migration – Hinzufügen von Check Constraints in der Tabelle

Lesezeit: 4 Minuten

Ich möchte eine Tabelle in Laravel Migration wie folgt erstellen:

CREATE TABLE Payroll
(
 ID int PRIMARY KEY, 
 PositionID INT,
 Salary decimal(9,2) 
 CHECK (Salary < 150000.00)
);

Was ich getan habe, ist-

Schema::create('Payroll', function (Blueprint $table)
{
    $table->increments('id');
    $table->integer('PositionID ');
    $table->decimal('Salary',9,2);
    //$table->timestamps();
});

Aber ich kann das nicht erstellen-

 CHECK (Salary < 150000.00)

Kann mir bitte jemand sagen, wie man das umsetzt CHECK Einschränkungen hinein Laravel-Migration ?

  • Für die Googler unter uns bedarf die Antwort von Kael Watts-Deuchar einer Aktualisierung. Ab MariaDB 10.2.1 MariaDB unterstützt jetzt Check Constraints. (Ich kann Kael nicht direkt kommentieren, da mir der erforderliche Ruf von 50 fehlt).

    – Pascal Bakhuis

    7. Oktober 2018 um 19:04 Uhr

Das Hinzufügen von Einschränkungen wird von der Blueprint-Klasse (zumindest ab Laravel 5.3) jedoch nicht unterstützt ist Es ist möglich, Ihren Tabellen direkt aus Ihren Migrationen Einschränkungen hinzuzufügen, indem Sie Datenbankanweisungen verwenden.

In Ihrer Migrationsdatei

public function up ()
{
    Schema::create('payroll', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('position_id');
        $table->decimal('salary',9,2);
    });

    // Add the constraint
    DB::statement('ALTER TABLE payroll ADD CONSTRAINT chk_salary_amount CHECK (salary < 150000.00);');
}

  • Dieser Ansatz funktioniert, aber bitte beachten Sie, dass er mit SQLite nicht funktioniert (z. B. wenn er als In-Memory-Datenbank zum Testen verwendet wird). SQLite unterstützt keine Änderung von Einschränkungen nach der Tabellenerstellung. Um dies zu umgehen, müssen Sie sicherstellen, dass Sie die Einschränkung nur für alles andere als SQLite hinzufügen.

    – Wütender UbuntuNerd

    29. Mai 2018 um 10:39 Uhr

Ich glaube nicht, dass dies ein Feature in Laravel-Migrationen ist. Ich denke, dies muss in Ihrer Modell- oder Validierungslogik enthalten sein, es sei denn, Sie fügen es manuell zu MYSQL hinzu

Das würde ich tun

$this->validate($request, [
    'Salary' => 'max:150000.00',
]);

  • So würde ich das auch lösen. Verwenden Sie diese Funktion in Ihrem Controller, wo Sie die Anfrage erhalten, bevor Sie die Daten speichern oder aktualisieren.

    – Philipp Schemel

    6. Juli 2016 um 12:15 Uhr


  • Ich frage nicht danach, ich frage nach automatischer Validierung mit MySQL-Ende, also hilft es mir nicht. Aber danke für den Versuch zu helfen 🙂

    – Abrar Jahin

    6. Juli 2016 um 12:18 Uhr

  • mysql unterstützt Check Constraint nicht!

    – Yasser CHENIK

    15. Juli um 14:49 Uhr

Benutzeravatar von Gerard Reches
Gerhard Reche

Dieses Feature ist nicht in der Blueprint-Klasse enthalten, daher können Sie dies nicht in Ihrer Migrationsdatei tun.

Aber in Ihrem Gehaltsabrechnungsmodell können Sie einen Mutator erstellen:

class Payroll extends Model{

    public function setSalaryAttribute($value){
        $this->attributes['Salary'] = $value < 150000.00 ? $value : 150000.00;
    }

}

Wenn also ein Gehaltsattribut für die Gehaltsabrechnung erstellt oder aktualisiert wird, wird diese Methode automatisch ausgelöst und überprüft, ob der neue Wert 150000,00 nicht überschreitet

EDIT: Sie sollten sich das ansehen Mutatoren Dokumentation in Laravel-Docs.

  • Du kann Fügen Sie Einschränkungen in Ihren Migrationsdateien hinzu, ohne die Blueprint-Klasse zu verwenden. Siehe meine Antwort für Details.

    – Michael

    24. August 2016 um 22:53 Uhr

  • Dadurch wird der Betrag stillschweigend begrenzt, was das komplette Gegenteil von dem ist, was die CHECK CONSTRAINT tun würde – einen Fehler auslöst. Ich schlage vor, dass Sie einen Fehler ausgeben, wenn Sie das Verhalten von CHECK CONSTRAINT etwas nachahmen möchten

    – Peter Chaula

    29. September 2021 um 11:30 Uhr

Benutzeravatar von Kael Watts-Deuchar
Kael Watts-Deuchar

Diese Antwort ist veraltet, MariaDB 10.2.1 und MySQL 8.0.16 unterstützen beide ordnungsgemäße Prüfeinschränkungen.


MySQL/Mariadb ignorieren CHECK Beschränkungen, also müssen Sie stattdessen Trigger verwenden. Trigger können nur so eingestellt werden, dass sie auf einem von INSERT/UPDATE/DELETE ausgeführt werden. Wenn wir also möchten, dass es sowohl auf INSERT als auch auf UPDATE ausgeführt wird, müssen wir eine Prozedur erstellen und sie dann von zwei separaten Triggern aufrufen.

DB::statement() unterstützt diese Syntax nicht, also müssen wir stattdessen PDO::exec() verwenden.

Hier ist die TRIGGER Syntax für Michaels Beispiel:

public function up()
{
    Schema::create('Payroll', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('position_id');
        $table->decimal('salary', 9, 2);
    });

    DB::connection()->getPdo()->exec("
        -- Create the procedure
        CREATE PROCEDURE payroll_check_salary_amount (salary INT)
        BEGIN
            IF NOT (salary < 150000.00) THEN
                SIGNAL SQLSTATE '45000' SET message_text="salary must be less than 150000.00";
            END IF;
        END;

        -- Create the INSERT trigger
        CREATE TRIGGER payroll_check_salary_amount_insert BEFORE INSERT ON Payroll
        FOR EACH ROW
        BEGIN
            CALL payroll_check_salary_amount(NEW.salary);
        END;

        -- Create the UPDATE trigger
        CREATE TRIGGER payroll_check_salary_amount_update BEFORE UPDATE ON Payroll
        FOR EACH ROW
        BEGIN
            CALL payroll_check_salary_amount(NEW.salary);
        END;
    ");
}

public function down()
{
    Schema::dropIfExists('Payroll');
    DB::statement('DROP PROCEDURE IF EXISTS payroll_check_salary_amount');
}

Um Einschränkungen hinzuzufügen, können Sie den folgenden Code erstellen

$table->enum('choices', ['foo', 'bar']);

aber wenn Sie es mit arithmetischen Operationen machen wollen, ist die Lösung, es mit einer SQL-Anweisung zu machen, wie von **@Michael** erwähnt

// Add the constraint
DB::statement('ALTER TABLE payroll ADD CONSTRAINT chk_salary_amount CHECK (salary < 150000.00);');

Überprüfe das Folgende Verknüpfung für mehr Informationen

public function up ()
{
    Schema::create('payroll', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('p_id');
        $table->decimal('payment',9,2);
    });

    // Add the constraint`enter code here`
    DB::statement('ALTER TABLE payroll ADD CONSTRAINT check_salary_amount CHECK (payment < 2000.00);');
}

1403740cookie-checkLaravel-Migration – Hinzufügen von Check Constraints in der Tabelle

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy