라라벨 공부
개요
이전에 포스팅한 라라벨 난수 액셀 다운로드 포스트가 기억나시나요?
안 나면 다음 주소로 => 바로가기
사실 해당 글에서 받는 파일은 액셀(xlsx)이 아닌 csv 파일입니다.
csv는 Comma Separated Values로 쉼표로 구분되는 값을 의미합니다.
해당 포스트에서는 csv를 읽어서 디비에 저장할 수 있게 하려고 합니다.
CSV 파일 만들기
이전에 만든 기능을 통해 csv을 만들 것입니다, 또는 이미 있으신 분들은 넘어가셔도 됩니다.
우선 이전에 만든 RandomGeneratorExport를 수정해줍시다.
확률상으로 난수 길이가 길어지면 중복이 생기기가 힘들지만 혹시 모르니 중복 체크를 넣어주고
csv를 읽는 과정에 필요없으니 숫자 번호를 지워줍시다.
...
class RandomGeneratorExport implements FromCollection
{
...
/**
* @return \Illuminate\Support\Collection
*/
public function collection()
{
// 대용량 데이터도 만들기 위해 제한을 임시로 풀었습니다.
ini_set('max_execution_time', '300');
ini_set('memory_limit','-1');
$randomNumbers = [];
$count = 0;
// 중복이 없으면 통과
while ($count != $this->count) {
$randomNumbers = [];
// $this->count와 이 메소드 내에 지역 변수 $count는 다릅니다.
for ($index = 0; $index < $this->count; $index++) {
$randomNumbers[] = $this->getRandomNumber();
}
$randomNumbers = array_unique($randomNumbers);
$count = count($randomNumbers);
}
$result = [];
// 번호 저장 제거
foreach ($randomNumbers as $index => $randomNumber){
$result[] = [$randomNumber];
}
return new Collection($result);
}
...
}
이제 route에서 설정한 경로 가서 csv를 받아줍시다.
저는 아래와 같기에 도메인/random 입니다.
Route::get('random',[RandomGeneratorController::class,'export'])->name('random.export');
그러면 아래와 같이 csv를 다운로드할 수 있습니다.
CSV Seeding
이제 다운로드한 csv를 seeder를 통해 디비에 저장해줍시다.
만든 csv를 프로젝트의 database/csv 폴더를 만들고 아래에 넣어줍시다.
아래 명령어로 migration과 model를 만들어줍시다.
php artisan make:model -m Code
이러면 migration 파일과 model 생성됩니다.
database/migrations/create_codes_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('codes', function (Blueprint $table) {
$table->id();
$table->string('code',10)->index()->comment('난수');
$table->enum('used',['Y','N'])->comment('사용 여부');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('codes');
}
};
모델 설정을 해줍시다.
app/Models/Code.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Code extends Model
{
use HasFactory;
public $timestamps = false;
protected $fillable = [
'code', 'used'
];
}
실제 DB에 테이블을 생성합니다.
php artisan migrate
데이터를 넣어주는 seeder를 생성해줍시다.
php artisan make:seeder CodeSeeder
databases/seeders/CodeSeeder.php
<?php
namespace Database\Seeders;
use App\Models\Code;
use Illuminate\Database\Seeder;
class CodeSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// 테이블 초기화
Code::truncate();
// 읽을 파일 명
$fileName = "random_number_2022-09-07.csv";
$csvFile = fopen(base_path("database/csv/$fileName"), "r");
// ','를 기준으로 데이터 분리
while (($data = fgetcsv($csvFile, null, ",")) != false) {
// 분리한 데이터로 데이터 저장
Code::create([
"code" => $data[0],
"used" => "N"
]);
}
fclose($csvFile);
}
}
이제 seed를 실행해줍시다.
php artisan db:seed --class=CodeSeeder
깔끔하게 읽어옵니다.
눈치 빠른 분들을 보셨겠지만 새로 csv를 만들어서 아까 보여드린 데이터와 다릅니다.
'PHP > Laravel' 카테고리의 다른 글
Laravel 9 Observer 써보자, 옵저버로 이력(히스토리) 쌓기 (0) | 2022.09.23 |
---|---|
Laravel 라라벨 스케줄링(Scheduling)하기 with crontab (0) | 2022.09.15 |
Laravel9 이미지 업로드 (with Dropzone) 2부 : Index & Destroy & Ajax (0) | 2022.08.30 |
Laravel9 이미지 업로드 (with Dropzone) 1부 : Setting & Create & Image Upload (0) | 2022.08.29 |
Laravel9 라라벨 난수 액셀 다운로드 (Laravel-Excel) (2) | 2022.08.22 |