使用ModelFactory生成测试数据
打赏作者

xiongzai

我是真的想看- -。然而真的有些 贵啊。

JellyBool

直接开半年vip,什么视频都可以看了。。。 @xiongzai

djsxianglei 回复 JellyBool

我开了1年支持老师

JellyBool 回复 djsxianglei

阔以阔以,这边没有毛病

601996710

‘Unable to locate factory with name [default] [App\Article].’

601996710

‘Unable to locate factory with name [default] [App\Article].’

601996710

报错咋办。。

601996710

好奇怪 只要把 ModelFactory.php 文件删掉 或者重命名就可以

601996710

前面能生成 估计两边一起错了 然后就生成了

后面生成不了就是代码输入错了

但是为啥把文件删掉 还可以生成呢

是不是命令行工具 tinke 只要不关掉就 可以生成 就算 那个文件删掉也可以?

chenxin

这个factory直接跳出tinker,factory里面的代码写对的,为何会出现这个情况,急急急!

JellyBool 回复 chenxin

不知道,你的系统是什么?开发环境是啥?

chenxin 回复 JellyBool

mac,开发环境apache

chenxin 回复 JellyBool

第一次生成是可以的,但是第二字改数据库字段后,重新生成只能生成users表,discussions表就生成不了

JellyBool 回复 chenxin

额。。。这个就很难知道是哪里出问题了

chenxin 回复 JellyBool

现在我换了一种方式,‘user_id’=>faker>numberBetween(1,20),lastuserid=>faker->numberBetween(1,20), 'last_user_id'=>faker->numberBetween(1,20),可以了。
之前是用App\User::lists()这个不行,这是不是说明user_id=App\User::lists()->toArray()只能用一次???很不解

JellyBool 回复 chenxin

好吧,5.3 的:

App\User::lists()->toArray()

这个还是出来 id 的吧

chenxin 回复 JellyBool

我是5.2的,这个第一次用可以,但是修改了factory之后就不行了。我的写法是App\User::lists(‘id’)->toArray()

JellyBool 回复 chenxin

改 factory 具体是改了什么?

chenxin 回复 JellyBool

‘confirm_code’=>str_random(48)这个,改了之后users表可以生成,但是discussions这张表就不可以生成。但是在这之前,我加了这句话之前把逗号写成了分号,进入tinker出错,改回逗号后,users表生成数据,但是discussions表生成时直接跳出tinker,没有任何反应

JellyBool 回复 chenxin

额,会这么诡异么?你的 Discussion 的 factory 是怎么定义的。

chenxin 回复 JellyBool
$factory->define(App\Discussion::class, function (Faker\Generator $faker) {
    return [
        'title' => $faker->sentence,
        'body' => $faker->paragraph,
        'user_id'=>$faker->numberBetween(1,20),
        'last_user_id'=>$faker->numberBetween(1,20),
    ];
});
JellyBool 回复 chenxin

额,感觉没有啥错啊。。。看不出什么问题了

chenxin 回复 JellyBool

这个最后两句是改了之后的没改之前就是那个通过user表中id来随机生成的。

chenxin 回复 JellyBool

我在想是不是有缓存啊,把之前的错误结果缓存。

JellyBool 回复 chenxin

有可能,我用了这么多次,都没出现过这样的问题。缓存是一个可以考虑的方向

Frank Wang 回复 JellyBool

我是Laravel 5.1,生成Discussion时候报错
Call to undefined function randomElement()

JellyBool 回复 Frank Wang
randomElements() //这样可以么?基本上检查一下拼写和单复数
Frank Wang 回复 JellyBool

还是不行,PHPStorm里面自动检测就有一个信息laravel Method ‘lists’ not found in class User,这是咋解决?
我的代码:

$factory->define(App\Discussion::class, function ($faker) {
    $user_ids = \App\User::lists('id')->toArray();
    return [
        'title' => $faker->sentence,
        'body' => $faker->paragraph,
        'user_id' => $faker->randomElement($user_ids),
        'last_user_id' =>$faker-> randomElement($user_ids),
    ];
});
Frank Wang 回复 JellyBool

真奇怪,清理一下缓存可以了。。。

JellyBool 回复 Frank Wang

嗯哼,解决了就好

ForeverPdq 回复 JellyBool

5.3废弃了lists采用了pluck,改成

$user_ids = \App\User::pluck('id')->toArray();

就可以了

乔泓恺-Jone 回复 JellyBool

\App\User::pluck(‘id’)->toArray(); 5.4

phperllh

5.3不能用lists()啦,官方建议用collection的pluck()的方法

JellyBool 回复 phperllh

恩,直接用 pluck 吧。

JoouA 回复 phperllh

我用的是laravel5.4版本的,lists()用不了 我就直接用的DB::select()实现的,看到原来还可以用pluck()谢谢

sevenhit

在生成discussion的表时,我的不管怎么弄,总是提示这个错误:
Argument 1 passed to Illuminate\Database\Grammar::parameterize() must be of the type array, string given, called in E:\xampp\htdocs\laravel51\vendor\laravel\framework\src\Illuminate\Database\Q
uery\Grammars\Grammar.php on line 672 and defined in E:\xampp\htdocs\laravel51\vendor\laravel\framework\src\Illuminate\Database\Grammar.php on line 118
怎么解决?

JellyBool 回复 sevenhit

仔细检查一下 factory 中定义的 Discussion 的每个属性的单复数,仔细看看

水云间chinahuanqiu 回复 sevenhit

你咋解决这个问题的?同问

1965741954

用5.3跟着做差点懵逼,App\User::lists()->toArray()这个貌似已经GG了,按楼上的$faker->numberBetween(1,20)可以

JellyBool 回复 1965741954

5.3 貌似没有 list 这个方法了,你用 pluck()

liudong0763

老师,是不是5.3没有了User::lists这个方法?
···
Call to undefined method Illuminate\Database\Query\Builder::lists()
···

JellyBool 回复 liudong0763

是的,你用 pluck

YVEND

之前看了你的其他系列,看这一章便十分的顺畅了。

YVEND

randomElements() randomElement() 居然是两个方法. 本章就遇到这个问题…

JellyBool 回复 YVEND

所以,看仔细一点点咯,我之前就被这个坑过一次

YVEND 回复 JellyBool

坑这些东西,需要老老实实的去踩一次下回才知道不会去踩. 但是学习过程中,重点是不知道坑在哪里…hah。

那天与你邂逅的波哥 回复 YVEND

我也踩了这个坑,找了好久哈哈

makehappier

我同样也遭受了lists这个坑。。。。。。

JellyBool 回复 makehappier

5.3 的时候使用 pluck() 代替 lists

makehappier 回复 JellyBool

我用的php7.0不知为什么不行,另外,我想请jelly帮我个忙,把我的用户名加几个*号,不然就没隐私了。。。。。。

JellyBool 回复 makehappier

加几个星号就算了吧。。。我帮你换个用户名倒是可以

makehappier 回复 JellyBool

那帮我换makehappier,多谢jelly

hao0661

jelly 刚开始的时候在modelfactory写的第二个没注释就运行了 , 然后生成第二个表的时候报Unable to locate factory with name [default] [Discussion]该如何解决呢.

JellyBool 回复 hao0661

不知道你说的这个第二个没注释就运行是什么。

Unable to locate factory with name [default] [Discussion]

这是因为没有在 modelfactory 正确定义 App\Discussion 吧

ForeverPdq

生成的数据都是英文的,能不能生成中文啥的?

JellyBool 回复 ForeverPdq

中文支持不太完备,但是还是可以设置为中文的 https://www.laravist.com/series/dive-a-little-deep-into-laravel-5/episodes/6

824286145
>>> factory(Discussion::class,30)->create();
InvalidArgumentException with message 'Unable to locate factory with name [default] [APP\Discussion].'
JellyBool 回复 824286145

大小写保证统一一下,比如 App

faly

这样是可以的

$factory->define(App\Discussion::class, function (Faker\Generator $faker) {
    $user_id = \App\User::pluck('id')->toArray();
    return [
        'title' => $faker->sentence,
        'body' => $faker->paragraph,
        'user_id' => $faker->randomElement($user_id),
        'last_user_id'=> $faker->randomElement($user_id),
        ];
});
Nancelglap

5.4用

'last_user_id' => $faker->randomElement($user_ids)

会报
Illuminate\Database\QueryException with message 'PHP error: Array to string conversion..
是因为 randomElement 函数返回的是数组,改成下面就可以了

'last_user_id' => ($faker->randomElement($user_ids))[0],
JellyBool 回复 Nancelglap

randomElement 返回的并不是数组吧。

还是用 @faly 的吧

dppppp

老师您这个la是用的什么版本的啊?

JellyBool 回复 dppppp

貌似这个是 5.1 的 laravel

hate

失误 失误 失误。打扰了