Laravel 使用 Faker DateTime 播种

Laravel Seeding with Faker DateTime

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

我如何创建这样的虚拟数据来模拟这种情况? (因为我需要它来测试我正在开发的功能)。

我已经尝试使用 DateTime methods of the Faker library,但其中 none 似乎符合我的需要。

如有任何帮助,我们将不胜感激。谢谢

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

<?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 分钟的间隔后每次迭代都会创建一个新读数。

一天的代码如下:

$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
}

Note: code for one day will create 480 inserts (for a year 480*365), maybe better approach would be to run it only once and just use sqldump / import before running your test-suite


您需要正确初始化$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