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();
});
}
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
]
Es gibt einen anderen, komplizierteren Ansatz, der es jedoch ermöglicht, mit dem Schema-Builder wirklich native Arrays zu erstellen.
Beispiel fĂĽr PostgreSQL.
- 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.
- Jetzt können Sie diesen Typ in Ihren Migrationen verwenden:
Schema::table('users', function (Blueprint $table) {
$table->addColumn('int_array', 'group_ids')->nullable();
});
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.