Pada artikel ini, kita akan membahas tentang seeder dalam Laravel yang dapat mengambil data dari file JSON dan sekaligus mengunggah gambar dari link eksternal. Seeder digunakan untuk mengisi data awal ke dalam tabel database.
Seeder yang akan kita bahas adalah ProductsTableSeeder. Berikut adalah penjelasan langkah demi langkah dari kode tersebut:
- Pertama, kita perlu mengimpor kelas-kelas yang diperlukan dan menggunakan trait
ImageUploadingTrait.
use Faker\Generator; use App\Models\Product; use Illuminate\Support\Str; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Storage; use App\Http\Controllers\Traits\ImageUploadingTrait;
- Selanjutnya, kita mendefinisikan kelas
ProductsTableSeederyang merupakan turunan dari kelasSeederyang disediakan oleh Laravel, dan menggunakan traitImageUploadingTrait.
class ProductsTableSeeder extends Seeder
{
use ImageUploadingTrait;
// ...
}
- Pada fungsi
run(), kita membaca data dari file JSON menggunakanFile::get()dan kemudian mengurai data tersebut menjadi objek menggunakanjson_decode().
$json = File::get("database/data/h.json");
$data = json_decode($json);
$faker = app(Generator::class);
- Selanjutnya, kita melakukan perulangan
foreachuntuk setiap elemen dalam objek data.
foreach ($data as $value) {
// ...
}
- Di dalam perulangan, kita mengambil gambar dari URL eksternal menggunakan
file_get_contents()dan mendapatkan informasi dasar dari gambar menggunakanpathinfo().
$gambar = file_get_contents(str_replace(" ", "%20", $value->src));
$basename = pathinfo(str_replace(" ", "%20", $value->src));
- Selanjutnya, kita membuat record baru dalam tabel ‘products’ menggunakan model
Productdan metodecreate(). Data yang diisi termasuk nama, slug, harga, kuantitas, deskripsi, detail, berat, ID kategori, dan waktu pembuatan dan pembaruan.
$produk = Product::create([
'name' => $value->title,
'slug' => Str::slug($value->title),
'price' => isset($value->harga) ? intval(str_replace(".", "", $value->harga)) : 0,
'quantity' => random_int(1, 100),
'description' => $faker->text(),
'details' => $faker->text(),
'weight' => random_int(100, 500),
'category_id' => random_int(1, 3),
'created_at' => now(),
'updated_at' => now(),
]);
- Setelah itu, kita mengatur properti media untuk record produk yang baru saja dibuat, termasuk nama koleksi, nama file, tipe mime, dan disk penyimpanan.
$media = $produk; $media->collection_name = 'gallery'; $media->filename = $basename['basename']; $media->mime_type = 'image/jpeg'; $media->disk = 'public';
- Selanjutnya, kita menggunakan
Storage::disk('public')->put()untuk menyimpan gambar ke dalam direktori yang ditentukan. Gambar disimpan dalam direktori ‘tmp/uploads/’ dengan nama file yang sesuai.
Storage::disk('public')->put('tmp/uploads/' . $media->filename, $gambar);
- Terakhir, kita menggunakan metode
save()pada relasi media untuk menyimpan record media yang terkait dengan produk.
$produk->media()->save($media);
Demikianlah penjelasan mengenai seeder Laravel dari file JSON sekaligus upload gambar dari link eksternal. Seeder ini memungkinkan kita untuk mengisi data produk dan mengunggah gambar terkait dari sumber eksternal dengan mudah.
Pastikan Anda telah mengimpor kelas-kelas yang diperlukan dan mengatur konfigurasi sistem file dengan benar sebelum menjalankan seeder ini.
Jadi kode selengkapnya bisa di lihat di bawah ini
<?php
namespace Database\Seeders;
use Faker\Generator;
use App\Models\Product;
use
Illuminate\Support\Str;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\File;
use
Illuminate\Support\Facades\Storage;
use App\Http\Controllers\Traits\ImageUploadingTrait;
class ProductsTableSeeder extends Seeder
{
use ImageUploadingTrait;
/** * Auto generated seed file * * @return void */ public function run()
{
$json = File::get("database/data/h.json");
$data = json_decode($json);
$faker = app(Generator::class);
foreach ($data as $value) {
$gambar = file_get_contents(str_replace(" ", "%20", $value->src));
$basename =
pathinfo(str_replace(" ", "%20", $value->src));
$produk = Product::create(['name' => $value->title, 'slug' =>
Str::slug($value->title), 'price' => isset($value->harga) ? intval(str_replace(".", "", $value->harga)) : 0, 'quantity' =>
random_int(1, 100), 'description' => $faker->text(), 'details' => $faker->text(), 'weight' => random_int(
100,
500
), 'category_id' => random_int(1, 3), 'created_at' => now(), 'updated_at' => now(),]);
$media =
$produk;
$media->collection_name = 'gallery';
$media->filename = $basename['basename'];
$media->mime_type =
'image/jpeg';
$media->disk = 'public';
Storage::disk('public')->put('tmp/uploads/' . $media->filename, $gambar);
$produk->media()->save($media);
}
}
}
