使用Faker DateTime进行Laravel播种

时间:2018-03-25 13:21:28

标签: laravel laravel-5 faker laravel-seeding

好的,我正在开发一个应用程序,它从设备接收一些实时传感器读数并将其存储在数据库内的表中。根据使用情况,设备将每天保持活动至少8小时,并且在指定的间隔(比如1分钟)之后将其传感器读数发送到服务器,然后如前所述将其保存在数据库表内。此应用程序提供的功能之一是,它允许您简要分析系统中特定设备的历史传感器数据,这可能会持续一年或两年,具体取决于设备何时激活。例如,如果设备在2016年8月10日被激活,那么它从那时起每隔至少8小时以1分钟的间隔发送数据到当前时间点。

如何创建此类虚拟数据来模拟此场景? (因为我需要它来测试我正在处理的功能)。

我尝试使用DateTime methods of the Faker library,但似乎没有一个符合我的需求。

任何帮助将不胜感激。感谢名单

编辑1:到目前为止,这是ReadingTableSeeder.php类。

<?php

use App\Models\Reading;
use Illuminate\Database\Seeder;

class ReadingTableSeeder extends Seeder
{
/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    $faker = Faker\Factory::create();

    // LOOP BODY START

    $dateTime = // Here i need to create datetime

    Reading::create([
        'device_key' => '60:01:94:37:D1:34',
        'temp' => $faker->randomFloat($nbMaxDecimals = 2, $min = 0, $max = 50.00),
        'hum' => $faker->randomFloat($nbMaxDecimals = 2, $min = 0, $max = 50.00),
        'oxygen' => $faker->randomFloat($nbMaxDecimals = 2, $min = 0, $max = 50.00),
        'created_at' => $dateTime,
        'updated_at' => $dateTime
    ]);

    // LOOP BODY END

  }
}

循环将从设备激活点开始,并在1分钟间隔后每次迭代创建一个新读数。

1 个答案:

答案 0 :(得分:0)

一天的代码如下:

$date = now(); // helper for Carbon::now()

foreach (range(1, 480) as $i) { // 8*60 minutes

    //do something with $date

    $date->addMinute(); // increments by a minute
}

多天的代码如下:

$date = now(); // helper for Carbon::now()
foreach (range(1, 365) as $day) {
    foreach (range(1, 480) as $i) { //8*60

        //do something with $date

        $date->addMinute(); // increments by a minute
    }

    $date->subMinutes(480)->addDay(); // subtract 480 minutes and increment by a day
}
  

注意:一天的代码会创建480个插页(一年480*365),也许更好的方法是只运行一次并使用sqldump /在运行测试套件之前导入

您需要正确初始化$date,假设设备将在早上8点开始,您可以执行以下操作:

$date = now()->endOfDay()->subHours(16); // 2018-03-25 07:59:59.999999
// or
$date = (new Carbon\Carbon('today noon'))->subHours(4); // 2018-03-25 08:00:00.0