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
好的,所以我正在开发一个应用程序,它从设备接收一些实时传感器读数并将其存储在数据库中的 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 year480*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