Seeder에서 Laravel로 그려진 데이터를 역생성하는 이야기
하고 싶은 일
※ 어떤 사이트에서 허가를 받았습니다
배포 방법
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',
]
]
);
}
}
사용해 본 소감.
$ composer require fabpot/goutte
<?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('スクレイピングバッチの実行が成功しました。');
}
}
$ composer require --dev "orangehill/iseed"
'providers' => [
/*
* データベースからLaravelのSeederを逆生成する
*/
Orangehill\Iseed\IseedServiceProvider::class
],
$ php artisan iseed {table_name}
<?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',
]
]
);
}
}
참고문
https://speakerdeck.com/bumptakayuki/tetahesufalsetetawolaravelfalseseedernini-sheng-cheng
나도 자신의 발표 자료를 참고하여 구체적으로 썼다
Reference
이 문제에 관하여(Seeder에서 Laravel로 그려진 데이터를 역생성하는 이야기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/bumptakayuki/items/fdf33ae1e36dfc9db7f0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)