我对 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',
    ];
}