我对 laravel 的迁移有一个奇怪的问题
I got an odd question on laravel's migration
我一直在尝试 google 这个,但我仍然无法在脑海中确定问题的确切答案。
我已经使用 php artisan
创建了一个迁移文件来设置一个名为 blogs
的 table(注意复数形式)。以前,table 被称为 blog
(单数)并且工厂不会播种,因为终端上显示的错误是 no relations found for "blogs"
- 这对我来说没有意义,因为每个引用我在控制器、模型和工厂中使用的都是单数。在我回滚迁移并以复数形式将 table 重新创建为 blogs
之前,它不会让我播种。
最奇怪的是,我仍然将其他所有内容都保留为单数,有人知道为什么只有当我对 table 的名称使用复数时播种才有效吗?
这是我将table从blog
修改为blogs
后的迁移文件:
class CreateBlogsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('blogs', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->string('title', 255);
$table->text('body');
$table->text('user_id');
});
}
这是我的工厂 - 名为 BlogFactory
:
namespace Database\Factories;
use App\Models\Blog;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
class BlogFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Blog::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'title' => $this->faker->sentence, //Generates a fake sentence
'body' => $this->faker->paragraph(30), //generates fake 30 paragraphs
'user_id' => User::factory() //Generates a User from factory and extracts id
];
}
}
这是我的模型 - 名为 Blog
:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Blog extends Model
{
use HasFactory;
protected $fillable = [
'title',
'body',
'user_id',
];
}
这是我的控制器 - 名为 BlogController
:
<?php
namespace App\Http\Controllers;
use App\Models\Blog;
use Illuminate\Http\Request;
class BlogController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return Blog::all();
}
我似乎记得关于重命名的 class-names and/or 表的类似问题......你可以在完成所有迁移后尝试 运行 “composer dump-autoload” and/or class-名称重构准备好了吗?我记得旧的 class-names 以某种方式被缓存,这让我很头疼。显然转储自动加载应该重建这个缓存。
编辑:对于最新的编辑,您不需要进行此更改,因为您已将迁移从创建 blog
table 更改为创建 blogs
table.
您需要编辑您的模型以了解您使用非标准 Laravel 格式作为您的 table 名称。
Laravel,默认情况下,将假定您的 table 是您的型号名称的复数形式。要覆盖它,您需要向模型添加以下属性:protected $table = 'blog';
见下面的代码;但是,我建议不要更改它并坚持 Laravel 定义的标准。你越接近框架想要的方式,它对你来说就越容易。尤其是学习的时候,不在同时拼框架,就轻松多了。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Blog extends Model
{
use HasFactory;
protected $table = 'blog';
protected $fillable = [
'title',
'body',
'user_id',
];
}
我一直在尝试 google 这个,但我仍然无法在脑海中确定问题的确切答案。
我已经使用 php artisan
创建了一个迁移文件来设置一个名为 blogs
的 table(注意复数形式)。以前,table 被称为 blog
(单数)并且工厂不会播种,因为终端上显示的错误是 no relations found for "blogs"
- 这对我来说没有意义,因为每个引用我在控制器、模型和工厂中使用的都是单数。在我回滚迁移并以复数形式将 table 重新创建为 blogs
之前,它不会让我播种。
最奇怪的是,我仍然将其他所有内容都保留为单数,有人知道为什么只有当我对 table 的名称使用复数时播种才有效吗?
这是我将table从blog
修改为blogs
后的迁移文件:
class CreateBlogsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('blogs', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->string('title', 255);
$table->text('body');
$table->text('user_id');
});
}
这是我的工厂 - 名为 BlogFactory
:
namespace Database\Factories;
use App\Models\Blog;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
class BlogFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Blog::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'title' => $this->faker->sentence, //Generates a fake sentence
'body' => $this->faker->paragraph(30), //generates fake 30 paragraphs
'user_id' => User::factory() //Generates a User from factory and extracts id
];
}
}
这是我的模型 - 名为 Blog
:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Blog extends Model
{
use HasFactory;
protected $fillable = [
'title',
'body',
'user_id',
];
}
这是我的控制器 - 名为 BlogController
:
<?php
namespace App\Http\Controllers;
use App\Models\Blog;
use Illuminate\Http\Request;
class BlogController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return Blog::all();
}
我似乎记得关于重命名的 class-names and/or 表的类似问题......你可以在完成所有迁移后尝试 运行 “composer dump-autoload” and/or class-名称重构准备好了吗?我记得旧的 class-names 以某种方式被缓存,这让我很头疼。显然转储自动加载应该重建这个缓存。
编辑:对于最新的编辑,您不需要进行此更改,因为您已将迁移从创建 blog
table 更改为创建 blogs
table.
您需要编辑您的模型以了解您使用非标准 Laravel 格式作为您的 table 名称。
Laravel,默认情况下,将假定您的 table 是您的型号名称的复数形式。要覆盖它,您需要向模型添加以下属性:protected $table = 'blog';
见下面的代码;但是,我建议不要更改它并坚持 Laravel 定义的标准。你越接近框架想要的方式,它对你来说就越容易。尤其是学习的时候,不在同时拼框架,就轻松多了。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Blog extends Model
{
use HasFactory;
protected $table = 'blog';
protected $fillable = [
'title',
'body',
'user_id',
];
}