创建一个cron以自动启动数据库播种器

时间:2016-03-24 11:17:13

标签: php json database laravel cron

在我的Laravel项目中,我有一个数据库,我通过网址获取。 这个数据库在json中。按照我的项目规范,我必须在我的本地项目中添加数据库,创建一个月度的cron,以便每月更新一次。

恢复数据并不是那么难,但我必须用这个数据创建一些播种机。有没有办法为数据库播种器实现每月cron,就像我使用每月cron最新的initail数据一样?

更具体地说,这是我在CronController.php恢复初始数据的cron:

public static function updateJson(Request $request)

{
  $type="application/json";
  $charset="utf-8";
  $path = 'database/market.json';

  $time=filemtime($path);
  $update=date("Y-M-d",$time);

  $updateMonth= date('Y-M-d',strtotime('+1 month',strtotime($update)));

  $now = date('Y-M-d');

  if($now >= $updateMonth)
  {
    $data = file_get_contents('url/for/the/public/database');

    $data = mb_convert_encoding($data, 'HTML-ENTITIES');
    $res= file_put_contents($path, $data);

    $whatIReallyNeed='update ok';

    return response()->json($whatIReallyNeed)->header('Content-type', $type, 'charset', $charset);

  } else {

    $error = 'no need to update';
    return response()->json($error)->header('Content-type', $type, 'charset', $charset);
  }
}

例如,我的数据库中有一个城镇表,请检查此表的迁移:

class CreateTownTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('town', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name', 255);
            $table->timestamps();
            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('town');
    }
}

播种器从json数据库TownTableSeeder.php注册数据:

public function run()
{
  $path = "public/database/market.json";
  // get contents of file
  $json = file_get_contents($path);
  // decode json datas
  $datas = json_decode($json, TRUE);
  // get the multi json array
  $arrayFeatures = $datas["features"];
  // define a new empty array
  $arrayTown = array();
  // populate the new array with values we need
  foreach ($arrayFeatures as $feature) {
    array_push($arrayTown, $feature["properties"]["commune"]);
  }
  // get unique entry for array
  $results = array_unique($arrayTown);
  // get only vales of array after do array_unique (no index)
  $whatIReallyNeed = array_values($results);
  foreach ($results as $result) {
    DB::table('town')->insert([
        'name' => $result,
    ]);
  }
}

所有这一切都运行良好,现在我想知道当cron更新我存储在项目中的json数据库时是否可以启动种子迁移。

1 个答案:

答案 0 :(得分:1)

您可以使用Laravel Events。当cron更新json数据时,只需fire an event

手册中的一个例子:

Event::fire(new PodcastWasPurchased($podcast));