【问题标题】:Creating relations using Laravel model factories使用 Laravel 模型工厂创建关系
【发布时间】:2017-03-21 20:20:52
【问题描述】:

我正在尝试使用模型工厂创建用户,但我遇到了关系错误。在User 模型中,我为模型JobLevel 创建了belongsTo 关系levels。在ModelFactory.php 我有以下代码。

    use App\User;
use App\JobLevel;

$factory->define(JobLevel::class, function (Faker\Generator $faker) {
    return [
        'name' => $faker->word,
        'rank' => $faker->randomDigit,
    ];
});

$factory->define(User::class, function (Faker\Generator $faker) {
    return [
        'firstname' => $faker->name,
        'middlename' => $faker->name,
        'lastname' => $faker->name,
        'email' => $faker->email,
        'job_level_id' => factory(JobLevel::class)->create()->id,
        'password' => bcrypt(str_random(10)),
        'remember_token' => str_random(10),
    ];
});

然后我在我的测试类中我使用工厂如下。

   /** @test */
        public function login_a_user()
        {
            $user = factory(User::class)->create();

            ...
        }

当我运行phpunit 时出现以下错误

    Illuminate\Database\QueryException: SQLSTATE[23000]: Integrity 

    constraint violation: 1452 Cannot add or update a child row: a foreign key 

    constraint fails (`testing_db`.`user`, CONSTRAINT `fk_user_job_level1`

 FOREIGN KEY (`job_level_id`) REFERENCES `job_level` (`id`) ON DELETE NO 

ACTION ON UPDATE NO ACTION) (SQL: insert into `user` (`updated_at`, 

`created_at`) values (2016-11-08 12:01:14, 2016-11-08 12:01:14))

【问题讨论】:

    标签: php laravel-5 phpunit


    【解决方案1】:

    出于测试目的,您能试试这个吗?

    $factory->define(User::class, function (Faker\Generator $faker) {
        return [
            'firstname' => $faker->name,
            'middlename' => $faker->name,
            'lastname' => $faker->name,
            'email' => $faker->email,
            'job_level_id' => 1,
            'password' => bcrypt(str_random(10)),
            'remember_token' => str_random(10),
        ];
    });
    
    public function login_a_user()
        {
            $job = factory(JobLevel::class)->create();
            $user = factory(User::class)->create();
    
            ...
        }
    

    我不确定你是否可以嵌入这些工厂。

    【讨论】:

    • 很公平,但您仍然收到 SQL 错误消息吗?
    猜你喜欢
    • 2020-03-09
    • 2018-06-13
    • 2022-11-22
    • 2015-12-09
    • 2018-09-03
    • 2018-08-11
    • 1970-01-01
    • 2019-06-21
    • 2018-01-10
    相关资源
    最近更新 更多