【问题标题】:laravel faker duplicate datalaravel faker 重复数据
【发布时间】:2019-04-11 14:06:08
【问题描述】:

我有一个 hits 的 Laravel 表。我想根据命中位置生成大量的测试数据来测试一些图表,所以我创建了一个这样的工厂:

<?php

use Carbon\Carbon;
use Faker\Generator as Faker;

$factory->define(App\Hit::class, function (Faker $faker) {
    $date = Carbon::parse($faker->dateTimeBetween("-2 months", "now")->format('Y-m-d'));
    $faker->seed(rand());

    return [
        'latitude' => '',
        'longitude' => '',
        'country' => 'US',
        'state' => '',
        'city' => '',
        'created_at' => $date,
        'updated_at' => $date,
    ];
});

然后在HitsTableSeeder 中这样做:

<?php

use Illuminate\Database\Seeder;

class HitsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $i = 0;

        while ($i <= 25000) {
            factory(App\Hit::class)->create(
                [
                    'latitude' => $faker->latitude,
                    'longitude' => $faker->longitude,
                    'country' => 'US',
                    'state' => $faker->state,
                    'city' => $faker->city,
                ]
            );
            $i++;
        }
    }
}

它总是返回相同的数据:

-[ RECORD 1 ]------+---------------------------
id                 | 1
latitude           | 41.31
longitude          | -72.92
country            | US
state              | CT
city               | New Haven
-[ RECORD 2 ]------+---------------------------
id                 | 2
latitude           | 41.31
longitude          | -72.92
country            | US
state              | CT
city               | New Haven
-[ RECORD 3 ]------+---------------------------
id                 | 3
latitude           | 41.31
longitude          | -72.92
country            | US
state              | CT
city               | New Haven

无论我是尝试覆盖表播种器中的工厂值还是直接在工厂中写入数据并且不要尝试覆盖播种器中的值,都会发生这种情况。

我怎样才能得到真正随机的数据?

注意:我接受@Erick Patrick 的回答是因为他是正确的,但我一直使用的方法也是正确的。问题原来是Hit 模型在保存命中之前附加了一个event 对命中进行地理编码——并且由于某种原因,地理编码器总是为伪造的数据返回相同的位置,大概是因为它不可能找到了!

【问题讨论】:

  • $faker 定义在哪里?

标签: php laravel laravel-5 faker


【解决方案1】:

在你的工厂修改返回的数组,像这样:

$factory->define(App\Hit::class, function (Faker $faker) {
    $date = Carbon::parse($faker->dateTimeBetween("-2 months", "now")->format('Y-m-d'));
    $faker->seed(rand());

    return [
        'latitude' => $faker->latitude($min = -90, $max = 90),   
        'longitude' => $faker->longitude($min = -180, $max = 180),
        'country' => $faker->countryCode,
        'state' => $faker->stateAbbr,
        'city' => $faker->country,
        'created_at' => $date,
        'updated_at' => $date,
    ];
});

还有你的HitsTableSeeder

public function run()
{
    factory(App\Hit::class, 2500)->create();
}

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 2015-09-11
    • 2016-08-18
    • 2016-09-09
    • 2015-06-09
    • 2016-05-06
    • 2011-07-18
    • 2021-06-08
    • 2019-07-08
    相关资源
    最近更新 更多