【问题标题】:Laravel FactoryLaravel 工厂
【发布时间】:2020-11-20 03:29:40
【问题描述】:

您好,我是在 Laravel 上创建工厂的新手,我正在建立一个博客网站。目前不需要用户,因为它是草稿,但我正在尝试建立一个工厂来创建虚拟博客文章。

我有一个 Post.php 文件,如下所示:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $table = 'posts';

    public $primaryKey = 'id';

    public $timestamps = true;
}

我的 PostFactory 看起来像这样

use App\Post;
use Faker\Generator as Faker;
use Illuminate\Support\Str;

$factory->define(App\Post::class, function (Faker $faker) {
    return [
        'title' => $faker->name,
        'body' => $faker->unique()->safeEmail,
    ];
});

但每次我尝试创建记录时,它都会抛出此错误“InvalidArgumentException with message 'Unable to locate factory for [App/Post]。'” 我知道它关于链接这些文件,但我不知道该怎么做。

【问题讨论】:

  • 后模型的文件应命名为Post.php,而不是posts.php。此外,您在模型中声明的所有属性都是不必要的,并且由 Laravel 自动声明。

标签: laravel eloquent factory


【解决方案1】:

首先如上所述,您的文件必须命名为 Post.php 而不是 posts.php。

由于您在文件开头使用 App\Post,因此您只需调用 Post::class $factory->define(Post::class, function (Faker $faker)

另一个选项也可能是您在作曲家类映射中缺少工厂文件夹:

"autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },

如果这不能解决问题,那么您可能需要将代码发布到您调用工厂的位置

@edit

this is pretty good overview over conventions

【讨论】:

  • 抱歉工厂应该在哪里调用,在controller.php等中
  • 或在播种机中任何您需要一些虚拟数据的地方,但它现在是否适用于更改?
  • 将帖子更改为帖子确实有效,但是在我的整个系统中它没有运行,因为我使用 Post 创建,因为在整个系统中无论如何都可以在不更改系统的情况下处理这个问题,为什么它可以工作对于帖子而不是帖子
  • 这是因为 laravel 自动检测文件名。如果遵循正确,Laravel 能够自行识别所有此类关系。例如,它还将检测数据库表,而无需指定$tableattribute。我只需将您的文件重命名为 Post.php 就足够了。 @cliff12345
  • 对不起,我没有关注,整个系统都使用 Post 类,但表名是帖子。为什么工厂不工作,是不是因为表被称为posts
猜你喜欢
  • 2017-05-29
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 2020-11-24
  • 2017-08-02
  • 2015-09-16
相关资源
最近更新 更多