Seeder에서 Laravel로 그려진 데이터를 역생성하는 이야기

11528 단어 PHPLaravel

하고 싶은 일

  • 한 사이트에서 스캔한 데이터를 DB에 저장합니다.
    ※ 어떤 사이트에서 허가를 받았습니다
  • 로컬 개발 환경에서도 Seeder는 어느 정도 테스트 데이터로 준비하기를 희망한다
  • PHPUNit을 실행할 때 테스트 데이터를 만들고 싶습니다
  • 배포 방법



    1.fabpot/goutte 설치

    $ composer require fabpot/goutte
    

    2. 그릴 배치 만들기

    <?php
    
    namespace App\Console\Commands;
    
    use App\Entity\Article;
    use Goutte\Client;
    use Illuminate\Console\Command;
    use Illuminate\Support\Facades\Log;
    
    /**
     * Class ScrapingCommand
     * @package App\Console\Commands
     */
    class ScrapingCommand extends Command
    {
    
        /**
         * スクレイピング先のURL
         */
        const SCRAPING_URL = 'http://example.com';
    
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'command:scraping_command';
    
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'Command description';
    
        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
        }
    
        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
    
            //インスタンス生成
            $client = new Client();
    
            //取得とDOM構築
            $crawler = $client->request('GET', self::SCRAPING_URL);
    
            //要素の取得
            $tr = $crawler->filter('table tr')->each(function($element){
                echo $element->text()."\n";
            });
    
            // 以下略
    
            // 取得したデータをArticleエンティティに設定 ※例なので、ざっくり書いてます。
            $article = new Article();
            // 本当は良い感じに取得したデータをエンティティに詰める
            $article->title = $tr;
            // 以下略
    
            DB::beginTransaction();
            try {
                $article->save();
                DB::commit();
    
            } catch (\Exception $exception) {
                Log::error('記事の更新に失敗しました', [
                    'exception' => $exception->getMessage(),
                    'file' => __FILE__,
                    'method' => __FUNCTION__,
                    'line' => __LINE__
                ]);
                DB::rollBack();
            }
    
            Log::notice('スクレイピングバッチの実行が成功しました。');
        }
    }
    
    

    3. orangehill/iseed 설치

    $ composer require --dev "orangehill/iseed"
    
    집행
    config/app.php에 설정기 설정 추가
    'providers' => [
    
            /*
             * データベースからLaravelのSeederを逆生成する
             */
            Orangehill\Iseed\IseedServiceProvider::class
        ],
    

    4. 다음 명령을 실행하면 테이블의 내용에 해당하는 Seeder 클래스를 생성합니다.

    $ php artisan iseed {table_name} 
    
    집행

    5. Seeder 클래스 생성 후 이미지

    <?php
    
    use Illuminate\Database\Seeder;
    
    class ArticlesTableSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            \DB::table('articles')->delete();
    
            \DB::table('articles')->insert([
                    0 => [
                        'id' => 1,
                        'title' => 'タイトル',
                        'descrition' => '記事の説明文',
                        'category' => 'Tech',
                    ],
                    1 => [
                        'id' => 2,
                        'title' => 'タイトル',
                        'descrition' => '記事の説明文',
                        'category' => 'Tech',
                    ],
                    2 => [
                        'id' => 3,
                        'title' => 'タイトル',
                        'descrition' => '記事の説明文',
                        'category' => 'Tech',
                    ]
                ]
            );
        }
    }
    
    

    사용해 본 소감.

  • 명령 집행 시간이 상당히 짧아서 좋습니다
  • 데이터량이 많으면 파일 크기가 커지기 때문에 for문장 등으로 간단하게 중복 데이터를 정리할 수 있다면 더욱 좋다
  • 고객은 주 데이터를 제공하지 않거나 API가 존재하지 않아 반드시 스스로 데이터를 얻어야 하는 사건에 적합하다
  • 참고문


  • https://speakerdeck.com/bumptakayuki/tetahesufalsetetawolaravelfalseseedernini-sheng-cheng
    나도 자신의 발표 자료를 참고하여 구체적으로 썼다
  • https://qiita.com/imunew/items/3973658bdcae9ab77b8a
  • 좋은 웹페이지 즐겨찾기