播种 table 使用模型工厂未保存
Seeding table using model factory not saving
我一直在尝试使用模型工厂在我的网站上设置第一个 table 的播种。我手动输入的种子可以工作,但我想确保我也可以使用工厂来播种,以用于将来的测试和所有爵士乐。手动输入工作正常,但使用模型工厂创建会导致 SQL 语句仅更新时间戳。它插入一个空白行(时间戳除外),然后由于其中一列的唯一约束而失败,因此它无法输入另一个空白行。我一直无法弄清楚为什么它没有生成正确的插入,即使工厂实际上正在创建一组好的数据。 (通过打印数组进行测试。)非常欢迎任何有关如何解决此问题的帮助。
模型工厂:
$factory->define(App\Models\Site::class, function (Faker\Generator $faker) {
$site = new App\Models\Site;
$siteTypes = array_keys($site->siteTypes);
$return = [
'site_name' => $faker->word
, 'site_url' => $faker->url
, 'site_type' => $faker->randomElement($siteTypes)
, 'is_active' => round(rand(0,1))
, 'created_at' => $faker->unixTime
, 'updated_at' => $faker->unixTime
];
return $return;
});
DatabaseSeeder.php:
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use App\Models\Site;
class DatabaseSeeder extends Seeder
{
public function run() {
Model::unguard();
DB::delete('delete from sites');
DB::statement('alter table sites auto_increment = 1');
$this->call(SiteTableSeeder::class);
DB::statement('alter table sites auto_increment = 10000');
Model::reguard();
}
}
SiteTableSeeder:
class SiteTableSeeder extends Seeder
{
public function run()
{
<snip out the other manual seeds>
DB::table('sites')->insert([
'site_id' => 9999,
'site_name' => 'Generic Online Site',
'site_url' => 'http://generic.nextworth.com',
'site_type' => 'online',
'is_active' => 1,
]);
factory('App\Models\Site', 5)->create();
}
}
created_at
和 updated_at
不使用 unix 时间。使用 $faker->dateTime($max = 'now');
Laravel 将在修改模型时自动更新这些值,所以可能发生的情况是播种失败但它已经创建了记录并添加了 updated_at
和 created_at
值
居然有答案。我正在使用 __construct 方法,但我没有做属性的事情。我补充说,一切都很好。谢天谢地! :)
我一直在尝试使用模型工厂在我的网站上设置第一个 table 的播种。我手动输入的种子可以工作,但我想确保我也可以使用工厂来播种,以用于将来的测试和所有爵士乐。手动输入工作正常,但使用模型工厂创建会导致 SQL 语句仅更新时间戳。它插入一个空白行(时间戳除外),然后由于其中一列的唯一约束而失败,因此它无法输入另一个空白行。我一直无法弄清楚为什么它没有生成正确的插入,即使工厂实际上正在创建一组好的数据。 (通过打印数组进行测试。)非常欢迎任何有关如何解决此问题的帮助。
模型工厂:
$factory->define(App\Models\Site::class, function (Faker\Generator $faker) {
$site = new App\Models\Site;
$siteTypes = array_keys($site->siteTypes);
$return = [
'site_name' => $faker->word
, 'site_url' => $faker->url
, 'site_type' => $faker->randomElement($siteTypes)
, 'is_active' => round(rand(0,1))
, 'created_at' => $faker->unixTime
, 'updated_at' => $faker->unixTime
];
return $return;
});
DatabaseSeeder.php:
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use App\Models\Site;
class DatabaseSeeder extends Seeder
{
public function run() {
Model::unguard();
DB::delete('delete from sites');
DB::statement('alter table sites auto_increment = 1');
$this->call(SiteTableSeeder::class);
DB::statement('alter table sites auto_increment = 10000');
Model::reguard();
}
}
SiteTableSeeder:
class SiteTableSeeder extends Seeder
{
public function run()
{
<snip out the other manual seeds>
DB::table('sites')->insert([
'site_id' => 9999,
'site_name' => 'Generic Online Site',
'site_url' => 'http://generic.nextworth.com',
'site_type' => 'online',
'is_active' => 1,
]);
factory('App\Models\Site', 5)->create();
}
}
created_at
和 updated_at
不使用 unix 时间。使用 $faker->dateTime($max = 'now');
Laravel 将在修改模型时自动更新这些值,所以可能发生的情况是播种失败但它已经创建了记录并添加了 updated_at
和 created_at
值
居然有答案。我正在使用 __construct 方法,但我没有做属性的事情。我补充说,一切都很好。谢天谢地! :)