:::

13. 利用模型工廠產生隨機題目

  1. 建立一個模型工廠, 使用 Artisan 命令 make:factory 並指定模型來快速建立模型工廠:
    php artisan make:factory TopicFactory --model=Topic
  2. 這個新的模型工廠將被放置在 /專案/database/factories 目錄中。
    <?php
    
    use Faker\Generator as Faker;
    
    $factory->define(App\Topic::class, function (Faker $faker) {
        return [
            //
        ];
    });
    
  3. 修改一下內容,讓工廠自動產生加法的數學題目及答案(以加法為例):
    <?php
    
    use Faker\Generator as Faker;
    
    $factory->define(App\Topic::class, function (Faker $faker) {
        $items = [1, 2, 3, 4];
        shuffle($items);
    
        $random_date = $faker->dateTimeBetween('-3 days', '+3 days');
        $num1        = rand(1, 99);
        $num2        = rand(1, 99);
        return [
            'topic'           => $num1 . " + " . $num2,
            'opt' . $items[0] => $num1 + $num2,
            'opt' . $items[1] => $num1 . $num2,
            'opt' . $items[2] => rand(1, 99),
            'opt' . $items[3] => rand(1, 999),
            'ans'             => $items[0],
            'created_at'      => $random_date,
            'updated_at'      => $random_date,
        ];
    });
    
  4. 其中shuffle()是為了給選項隨機排序,並指定第一個選項$items[0]為正確答案,避免答案都是固定的選項。
  5. 完整的Faker用法可以參考:https://github.com/fzaninotto/Faker
  6. 這裡有各種方法的使用範例:https://www.cnblogs.com/love-snow/articles/7655450.html
  7. 若欲產生中文資料,請修改\專案\vendor\fzaninotto\faker\src\Faker\Factory.php
    <?php
    
    namespace Faker;
    
    class Factory
    {
        const DEFAULT_LOCALE = 'zh_TW';
  8. 我們可以利用tinker來測試一下(要離開tinker請輸入exit
    php artisan tinker
  9. 先建立一題試試
    factory(App\Topic::class)->make()
  10. 然後建立5題
    factory(App\Topic::class,5)->make()
  11. 建立5題並指定exam_id為1,然後存入資料庫:
    factory(App\Topic::class,5)->create(['exam_id' => 3])
  12. 可以利用此方式來建立大量測設內容,若工廠內容有改變,請離開tinker後再重新進入執行。

 

到GitHub觀看此單元程式異動


:::

書籍目錄

展開 | 闔起

http%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbsn%3D37%26tbdsn%3D1247

計數器

今天: 1853185318531853
昨天: 3438343834383438
總計: 7392182739218273921827392182739218273921827392182