Untuk menukar posisi di database Laravel secara bersamaan, Anda bisa menggunakan query builder atau Eloquent. Berikut adalah cara untuk melakukannya dengan menggunakan Eloquent. Misalnya, kita memiliki model User dengan kolom name dan position.
- Ambil data pengguna yang ingin ditukar:
Anda perlu mengambil kedua pengguna berdasarkan nama mereka. - Tukar posisi:
Setelah mengambil data, Anda dapat menukar posisi mereka dan menyimpannya kembali ke database.
Berikut adalah contoh kode:
use App\Models\User;
use Illuminate\Support\Facades\DB;
DB::transaction(function () {
// Ambil pengguna yang ingin ditukar
$jono = User::where('name', 'Jono')->first();
$rudi = User::where('name', 'Rudi')->first();
// Simpan posisi sementara
$tempPosition = $jono->position;
// Tukar posisi
$jono->position = $rudi->position;
$rudi->position = $tempPosition;
// Simpan perubahan
$jono->save();
$rudi->save();
});
Dalam kode di atas:
- Kami menggunakan
DB::transactionuntuk memastikan bahwa kedua operasi penyimpanan terjadi secara atomik. Jika salah satu gagal, perubahan tidak akan disimpan. - Kami mengambil pengguna dengan nama “Jono” dan “Rudi”.
- Posisi mereka ditukar dan perubahan disimpan kembali ke database.
Pastikan untuk menyesuaikan nama model dan kolom sesuai dengan struktur database Anda.
Berikut Contoh Lain yang berhasil
public function update(Request $request, Section $section)
{
$this->validate($request, [
'position' => ['required', 'max:10', 'numeric'],
'action' => ['in:up,down'],
'name' => ['string', 'unique:sections']
]);
if ($request->action == 'up') {
// Mencari section berdasarkan posisi yang yang lebih atas
$sectionAtas = Section::where('position', $request->position - 1)->first();
$sectionSekarang = $section->name;
//jika section atas Ada
if ($sectionAtas) {
// Menggunakan nama sementara untuk menghindari duplikat
$namaSectionAtas = $sectionAtas->name; // Nama sementara yang unik
$namaSementara = 'temp_name_' . uniqid(); // Nama sementara yang unik
$section->update(['name' => $namaSementara]); // Set nama section saat ini ke nama sementara
$sectionAtas->update(['name' => $sectionSekarang]); // Set nama section yang ditemukan ke nama section saat ini
$section->update(['name' => $namaSectionAtas]); // Set nama section saat ini ke nama sementara
}
// jika permintaan section turun
} else if ($request->action == 'down') {
// Mencari section berdasarkan posisi yang lebih rendah
$sectionBawah = Section::where('position', $request->position + 1)->first();
$sectionSekarang = $section->name;
if ($sectionBawah) {
// Menggunakan nama sementara untuk menghindari duplikat
$namaSectionBawah = $sectionBawah->name; // Nama sementara yang unik
$namaSementara = 'temp_name_' . uniqid(); // Nama sementara yang unik
$section->update(['name' => $namaSementara]); // Set nama section saat ini ke nama sementara
$sectionBawah->update(['name' => $sectionSekarang]); // Set nama section yang ditemukan ke nama section saat ini
$section->update(['name' => $namaSectionBawah]); // Set nama section saat ini ke nama sementara
}
} else {
$section->update(['name' => $request->name]);
}
return redirect()->route('admin.section.index')->with('message', 'Section Updated');
}
Atau dengan cara lain:
switch ($request->action) {
case 'up':
// Mencari section berdasarkan posisi yang yang lebih atas
$sectionAtas = Section::where('position', $request->position - 1)->first();
$sectionSekarang = $section->name;
//jika section atas Ada
if ($sectionAtas) {
// Menggunakan nama sementara untuk menghindari duplikat
$namaSectionAtas = $sectionAtas->name; // Nama sementara yang unik
$namaSementara = 'temp_name_' . uniqid(); // Nama sementara yang unik
$section->update(['name' => $namaSementara]); // Set nama section saat ini ke nama sementara
$sectionAtas->update(['name' => $sectionSekarang]); // Set nama section yang ditemukan ke nama section saat ini
$section->update(['name' => $namaSectionAtas]); // Set nama section saat ini ke nama sementara
}
break;
case 'down':
// Mencari section berdasarkan posisi yang lebih rendah
$sectionBawah = Section::where('position', $request->position + 1)->first();
$sectionSekarang = $section->name;
if ($sectionBawah) {
// Menggunakan nama sementara untuk menghindari duplikat
$namaSectionBawah = $sectionBawah->name; // Nama sementara yang unik
$namaSementara = 'temp_name_' . uniqid(); // Nama sementara yang unik
$section->update(['name' => $namaSementara]); // Set nama section saat ini ke nama sementara
$sectionBawah->update(['name' => $sectionSekarang]); // Set nama section yang ditemukan ke nama section saat ini
$section->update(['name' => $namaSectionBawah]); // Set nama section saat ini ke nama sementara
}
break;
default:
$section->update(['name' => $request->name]);
break;
}
