Ada*_*son 95 php migration mysql-error-1146 laravel
我只是在学习Laravel,并且有一个工作的迁移文件来创建一个用户表.我试图填充用户记录作为迁移的一部分:
public function up()
{
Schema::create('users', function($table){
$table->increments('id');
$table->string('email', 255);
$table->string('password', 64);
$table->boolean('verified');
$table->string('token', 255);
$table->timestamps();
DB::table('users')->insert(
array(
'email' => 'name@domain.com',
'verified' => true
)
);
});
}
Run Code Online (Sandbox Code Playgroud)
但是我在运行时遇到以下错误php artisan migrate:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vantage.users' doesn't exist
Run Code Online (Sandbox Code Playgroud)
这显然是因为Artisan还没有创建表,但所有文档似乎都说有一种方法可以使用Fluent Query来填充数据作为迁移的一部分.
谁知道怎么样?谢谢!
Ben*_*nRH 193
不要将DB :: insert()放在Schema :: create()中,因为create方法必须在插入内容之前完成表的制作.试试这个:
public function up()
{
// Create the table
Schema::create('users', function($table){
$table->increments('id');
$table->string('email', 255);
$table->string('password', 64);
$table->boolean('verified');
$table->string('token', 255);
$table->timestamps();
});
// Insert some stuff
DB::table('users')->insert(
array(
'email' => 'name@domain.com',
'verified' => true
)
);
}
Run Code Online (Sandbox Code Playgroud)
dar*_*uhn 76
我知道这是一个老帖子,但是因为它出现在谷歌搜索中,我想我会在这里分享一些知识.@ erin-geyer指出混合迁移和播种器可能会让人感到头疼,@ justamartin反驳说,有时您希望/需要将数据作为部署的一部分进行填充.
我更进一步说,有时希望能够一致地推出数据更改,以便您可以部署到分段,看到一切都很好,然后在相同结果的信心下部署到生产(而不必记住运行一些手动步骤).
然而,将种子和迁移分开仍然是有价值的,因为这是两个相关但不同的问题.我们的团队通过创建称为播种者的迁移而妥协.这看起来像:
public function up()
{
Artisan::call( 'db:seed', [
'--class' => 'SomeSeeder',
'--force' => true ]
);
}
Run Code Online (Sandbox Code Playgroud)
这允许您像迁移一样执行一次种子.您还可以实现阻止或增强行为的逻辑.例如:
public function up()
{
if ( SomeModel::count() < 10 )
{
Artisan::call( 'db:seed', [
'--class' => 'SomeSeeder',
'--force' => true ]
);
}
}
Run Code Online (Sandbox Code Playgroud)
如果少于10个SomeModel,这显然会有条件地执行你的播种机.如果您希望将播种机作为标准播种机包含在您调用时artisan db:seed以及迁移时执行的标准播种机,这样您就不会"加倍".您还可以创建反向播种器,以便回滚按预期工作,例如
public function down()
{
Artisan::call( 'db:seed', [
'--class' => 'ReverseSomeSeeder',
'--force' => true ]
);
}
Run Code Online (Sandbox Code Playgroud)
--force需要第二个参数才能使播种机在生产环境中运行.
Eri*_*yer 11
这里有一个非常好的解释,为什么使用Laravel的数据库播种器比使用迁移更可取:http://laravelbook.com/laravel-database-seeding/
虽然遵循官方文档上的说明是一个更好的主意,因为上述链接中描述的实现似乎不起作用且不完整. http://laravel.com/docs/migrations#database-seeding
Mar*_*bae 10
如果您使用 Laravel 8 并且想要使用多个记录进行初始化,您可以通过这两种方式中的任何一种来完成。
1. 不推荐的方式
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
DB::table('categories')->insert(
array(
[
'name' => 'Category1',
],
[
'name' => 'Category2',
],
[
'name' => 'Category3',
],
)
);
}
Run Code Online (Sandbox Code Playgroud)
上面的方法很好,但会将created_at和updated_at列留空。
2. 推荐方式
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
$data = array(
[
'name' => 'Category1',
],
[
'name' => 'Category2',
],
[
'name' => 'Category3',
],
);
foreach ($data as $datum){
$category = new Category(); //The Category is the model for your migration
$category->name =$datum['name'];
$category->save();
}
}
Run Code Online (Sandbox Code Playgroud)
这应该做你想做的。
public function up()
{
DB::table('user')->insert(array('username'=>'dude', 'password'=>'z19pers!'));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
82564 次 |
| 最近记录: |