如何使用外键laravel创建模型工厂

时间:2019-01-28 16:01:17

标签: php laravel laravel-5 faker

我有一个模型工厂,如下:

QuestionFactory.php:

$factory->define(App\Question::class, function (Faker $faker) {
    return [
        'question' => $faker->text($maxNbChars = 150),
        'subject_id' => $faker->randomElement(App\Subject::pluck('id')->toArray()),
        'sbj_type_id' => $faker->randomElement(App\SbjType::pluck('id')->toArray())
    ];
});

但是上面的代码还会在这里获取其他主题类型sbj_type_id链接到sbj_type表,然后还有一个与sbj_type相关的字段,。例如< / strong>,我有2个主题和4个子类型,所以我有2个与1个主题相关联的类型,另外2个与第二个主题相关,所以我也需要根据subject_id获取,我已经完成了

'sbj_type_id' => $faker->randomElement(App\SbjType::where('subject_id', App\Subject::inRandomOrder()->value('id'))->pluck('id')->toArray())

我需要根据sbj_type来获取subject_id

2 个答案:

答案 0 :(得分:0)

使用查询生成器的inRandomOrdervalue方法配对,直接从数据库中获取随机ID:

App\Subject::inRandomOrder()->value('id')

要将其放入您的工厂,它看起来像这样:

$factory->define(App\Question::class, function (Faker $faker) {
    return [
        'question' => $faker->text($maxNbChars = 150),
        'subject_id' => App\Subject::inRandomOrder()->value('id'),
        'sbj_type_id' => App\SbjType::inRandomOrder()->value('id'),
    ];
});

答案 1 :(得分:0)

我已经解决了我的问题,

$subject = App\Subject::inRandomOrder()->value('id');
return [
    'question' => $faker->text($maxNbChars = 150),
    'subject_id' => $subject,
    'sbj_type_id' => App\SbjType::where('subject_id', $subject)->inRandomOrder()->value('id'),
]

首先,我从数据库中获得subject_id并将其存储到变量$subject中,然后在伪造者代码中使用该变量作为条件,这样就解决了我的问题,这要感谢@JosephSilber