laravel 伪造重复数据

laravel faker duplicate data

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

<?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++;
        }
    }
}

它总是returns相同的数据:

-[ 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

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

如何获得真正随机的数据?

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

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

$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();
}