Laravel Factory:手动增加柱子

时间:2017-07-08 07:29:17

标签: php laravel laravel-5.4 laravel-seeding

对于以下工厂定义,列val tweets = sc.textFile(tweetInput) println("------------Sample JSON Tweets-------") for (tweet <- tweets.take(5)) { println(gson.toJson(jsonParser.parse(tweet))) } val tweetTable = sqlContext.jsonFile(tweetInput).cache() tweetTable.registerTempTable("tweetTable") println("------Tweet table Schema---") tweetTable.printSchema() println("----Sample Tweet Text-----") sqlContext.sql("SELECT text FROM tweetTable LIMIT 10").collect().foreach(println) println("------Sample Lang, Name, text---") sqlContext.sql("SELECT user.lang, user.name, text FROM tweetTable LIMIT 1000").collect().foreach(println) println("------Total count by languages Lang, count(*)---") sqlContext.sql("SELECT user.lang, COUNT(*) as cnt FROM tweetTable GROUP BY user.lang ORDER BY cnt DESC LIMIT 25").collect.foreach(println) println("--- Training the model and persist it") val texts = sqlContext.sql("SELECT text from tweetTable").map(_.head.toString) // Cache the vectors RDD since it will be used for all the KMeans iterations. val vectors = texts.map(Utils.featurize).cache() 需要是顺序的。已经有一个自动递增的列order。第一行的id应该从order开始,每个附加行的1应该是下一个数字(order12等。)

3

应该将$factory->define(App\AliasCommand::class, function (Faker\Generator $faker) { return [ 'user_id' => App\User::inRandomOrder()->first()->id, 'command' => $faker->word, 'content' => $faker->sentence, 'order' => (App\AliasCommand::count()) ? App\AliasCommand::orderBy('order', 'desc')->first()->order + 1 : 1 ]; }); 列设置为比上一行多1,但是,它会导致所有行都被分配order

3 个答案:

答案 0 :(得分:13)

这可能有用。

$factory->define(App\AliasCommand::class, function (Faker\Generator $faker) {
    static $order = 1;   
    return [
        'user_id' => App\User::inRandomOrder()->first()->id,
        'command' => $faker->word,
        'content' => $faker->sentence,
        'order'   => $order++
    ];
});

它只是在该函数内部保留一个计数器。

答案 1 :(得分:1)

如果您确定工厂模型生成将仅按顺序运行,并且您不关心预先存在的数据,则@apokryfos的答案是一个很好的解决方案。

但是,例如,如果您想生成要插入到已存在某些记录的测试数据库中的模型,这可能会导致错误的order值。

使用闭包作为列值,我们可以更好地自动化顺序。

$factory->define(App\AliasCommand::class, function (Faker\Generator $faker) {
    return [
        'user_id' => App\User::inRandomOrder()->first()->id,
        'command' => $faker->word,
        'content' => $faker->sentence,
        'order'   => function() {
            $max = App\AliasCommand::max('order'); // returns 0 if no records exist.

            return $max+1;
        }
    ];
});

在您的示例中您几乎是对的,问题是您在定义工厂时正在运行order值执行 ,而不是上面的代码执行< em>生成单个模型时。

按照相同的原则,您还应该将user_id代码括在一个闭包中,否则所有工厂生成的模型都将具有相同的用户ID。

答案 2 :(得分:0)

要实现真正的autoIncrement,请使用以下方法:

   $__count = App\AliasCommand::count();
   $__lastid = $__count ? App\AliasCommand::orderBy('order', 'desc')->first()->id : 0 ;


   $factory->define(App\AliasCommand::class,
       function(Faker\Generator $faker) use($__lastid){

       return [

         'user_id' => App\User::inRandomOrder()->first()->id,
         'command' => $faker->word,
         'content' => $faker->sentence,
         'order'   => $faker->unique()->numberBetween($min=$__lastid+1, $max=$__lastid+25),

         /*  +25 (for example here) is the number of records you want to insert 
             per run.
             You can set this value in a config file and get it from there
             for both Seeder and Factory ( i.e here ).
         */
      ];

   });