Laravel-Migrations-Array-Typ (Array in Datenbankspalte speichern)

Lesezeit: 4 Minuten

Benutzer-Avatar
Zakaria Acharki

Ich möchte ein Array von Ganzzahlen in meiner Tabelle speichern und kann keinen Typ finden, der Array in unterstützt Dokumentationirgendein Vorschlag.

Migration:

public function up()
{
    Schema::create('pickups', function (Blueprint $table) {
        $table->increment('id');
        $table->boolean('default');
        $table->integer('shifts');  <<--------- HERE I want to store an array of integers
        $table->integer('status_id');

        $table->timestamps();
    });
}

Benutzer-Avatar
Bogdan

Das array Der Datentyp ist nicht in allen Datenbanksystemen vorhanden, und da der Schema Builder von Laravel datenbankunabhängig ist, bietet er keine Methoden zum Erstellen ungewöhnlicher Datentypspalten. Sie haben also zwei Möglichkeiten:

1. Verwenden Sie eine rohe SQL-Anweisung, um die Spalte hinzuzufügen, so etwas wie die folgende Anweisung, die meiner Meinung nach funktionieren sollte. Obwohl ich nicht sicher bin, ob der Query Builder oder Eloquent diese Spaltentypen korrekt verarbeiten kann:

DB::statement('ALTER TABLE pickups ADD COLUMN shifts integer[]');

2. Verwenden Sie die verfügbare Problemumgehung von Eloquent, indem Sie Attribut-Casting. Erstellen Sie in Ihrer Migration die Spalte als json so:

public function up()
{
    Schema::create('pickups', function (Blueprint $table) {
        $table->increment('id');
        $table->boolean('default');
        $table->json('shifts');
        $table->integer('status_id');

        $table->timestamps();
    });
}

Dann kannst du deine einrichten Pickup Modell (falls Sie dies noch nicht getan haben) und verwenden Sie die $casts Eigentum:

class Pickup extends Model
{
    protected $casts = [
        'shifts' => 'array'
    ];
}

Dadurch wird Eloquent mitgeteilt, dass beim Abrufen von Daten aus der Datenbank die konvertiert werden müssen shifts Spaltenwert zu einem array. Dies emuliert nur ein tatsächliches Array, da die Spalte auf Datenbankebene vom Typ ist TEXT und das Array wird serialisiert. Wenn Sie jedoch den Spaltenwert deserialisieren, gibt Eloquent ein tatsächliches Array von Ganzzahlen zurück, das Sie in Ihrem Code verwenden können. Unten ist ein beispielhafter Anwendungsfall:

// Create a new Pickup entry
$pickup = App\Pickup::create([
    'default' => true,
    'shifts' => '[1, 5, 7]', // you can easily assign an actual integer array here
    'status_id' => 1
]);

Angenommen obiges erzeugt einen Eintrag mit id gleicht 1 wenn Sie den Eintrag später abrufen:

$pickup = App\Pickup::find(1);
dump($pickup->shifts);

Das dump() aus dem obigen Code wird ein tatsächliches Array von Ganzzahlen ausgegeben:

array:3 [▼
  0 => 1
  1 => 5
  2 => 7
]

  • Danke @Bogdan für deine tolle Antwort, leider wenn ich versuche, einen neuen Pickup-Eintrag mit zu erstellen 'shifts' => [1, 5, 7], Ich erhalte diese Fehlermeldung PHP warning: preg_replace(): Parameter mismatch, pattern is a string while replacement is an array.

    – Zakaria Acharki

    6. Oktober 2015 um 9:36 Uhr


  • okay jetzt ist es Arbeit wie folgt 'shifts' => '[1, 5, 7]',Danke 🙂

    – Zakaria Acharki

    6. Oktober 2015 um 9:53 Uhr


  • Ich habe dies mit einer sauberen Installation von Laravel 5.1 getestet und für mich funktioniert es tatsächlich, ohne Anführungszeichen um das Array zu setzen, wenn der Wert zugewiesen wird.

    – Bogdan

    6. Oktober 2015 um 10:04 Uhr

  • Würde die Abfrage in diesem Fall funktionieren und wie? ZB möchte ich alle Datensätze, die Schicht 5 enthalten.

    – Marin Leontenko

    21. April 2020 um 9:28 Uhr

Es gibt einen anderen, komplizierteren Ansatz, der es jedoch ermöglicht, mit dem Schema-Builder wirklich native Arrays zu erstellen.

Beispiel für PostgreSQL.

  1. Registrieren Sie sich neu int_array Typ, der aufgelöst wird int[] durch Erweiterung der bestehenden DB-Schema-Grammatik:
\DB::connection()->setSchemaGrammar(new class extends PostgresGrammar {
    protected function typeInt_array(\Illuminate\Support\Fluent $column)
    {
        return 'int[]';
    }
});

Sie können diesen Code direkt in die Migration einfügen, wenn Sie ihn nur einmal oder später benötigen AppServiceProvider um es im gesamten Projekt verfügbar zu machen.

  1. Jetzt können Sie diesen Typ in Ihren Migrationen verwenden:
Schema::table('users', function (Blueprint $table) {
    $table->addColumn('int_array', 'group_ids')->nullable();
});

  • Vielen Dank. Das hat mir am besten gefallen 🙂 Gott segne!

    – Lachezar Raychev

    12. April 2021 um 6:07 Uhr

Benutzer-Avatar
Benutzer2909823

Ich speichere das Array im Allgemeinen in der Spalte als durch Kommas getrennte Zeichenfolge und rufe es mit explodieren ab.

In Ihrem Fall würde ich beim Speichern so etwas tun:

$arraystring = implode(',',$array);

$pickups->shifts = $arraystring; //$pickups is an instance of your Pickups model.

//Then while retrieving I would just use;

$array = $pickups->shifts ? explode(',',$pickups-shifts) : []; 
/*just to make sure it is not an empty string 
else you will get an error on explode.*/

Einfach, speichern Sie Ihre Array-Ganzzahl mit json:

$table->json('shifts');

du kannst einfach hinzufügen:

protected $cast=['shifts'=>'array'];

In Ihrer Modellklasse funktioniert es für mich mit Laravel 8.

1312500cookie-checkLaravel-Migrations-Array-Typ (Array in Datenbankspalte speichern)

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

Privacy policy