【问题标题】:Laravel Seeding with Faker DateTimeLaravel 使用 Faker DateTime 播种
【发布时间】:2018-09-03 16:54:51
【问题描述】:

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

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

我尝试过使用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 分钟间隔后的每次迭代中创建一个新读数。

【问题讨论】:

  • 你的代码在哪里?
  • 我没有看到任何循环代码。能保证每分钟都有记录吗?
  • @kyslik 我还不知道循环将如何工作,也不一定,我只想创建一些虚拟数据,从一个时间点到另一个时间点,并创建一条记录在定义的时间间隔之后(可能是一分钟甚至一小时)。

标签: laravel laravel-5 faker laravel-seeding


【解决方案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
}

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


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

【讨论】:

  • 感谢您的回答,正是我想要的:)
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 2017-08-29
  • 2019-05-18
  • 2015-06-02
  • 2018-05-26
  • 2018-09-10
  • 2022-07-21
  • 2019-01-17
相关资源
最近更新 更多