美文网首页IT在线课程
[技术分享] 你知道 laravel 的数据填充是什么东东嘛

[技术分享] 你知道 laravel 的数据填充是什么东东嘛

作者: 我叫刘小Q | 来源:发表于2019-04-17 14:50 被阅读164次

    很多时候我们需要在数据表里面添加很多“假数据”。或许我们单独一条条的添加,或者写方法批量的导入。今天我们给大家介绍一种laravel自带的一种‘写假数据’的方式---数据填充。

    Laravel 可以用 seed 类轻松地为数据库填充测试数据。所有的 seed 类都存放在 database/seeds 目录下。你可以任意为 seed 类命名。

    目录

    以laravel5.5为例,默认存在UsersTableSeeder

    img
    编写 Seeders

    通过运行 Artisan 命令来生成 Seeder。生成的 seeders 都将被放置在 database/seeds 目录下

    php artisan make:seeder DatabaseSeeder
    

    我们生成的这个DatabaseSeeder,默认只有一个方法:run。在 run 方法里你可以根据需要在数据库中插入数据。你也可以用 查询构造器Eloquent模型工厂 来手动插入数据。

    <?php
    
    use Illuminate\Database\Seeder;
    
    class DatabaseSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            //
        }
    }
    
    查询构造器

    DatabaseSeeder 类中的 run 方法中添加一条数据插入语句

        public function run()
        {
             DB::table('user')->insert([
                'name' => str_random(10),
                'email' => str_random(10).'@gmail.com',
                'password' => bcrypt('secret'),
            ]);
        }
    

    或者添加多条数据

    public function run()
        {
        foreach (range(1, 100) as $item) {
            $data[] = [
                'name' => str_random(10),
                'email' => str_random(10).'@gmail.com',
                'password' => bcrypt('secret'),
              ];
          }
            \DB::table('book')->insert($data);
        }
    
    注意

    我这里用的insert方法,也可以使用create,但是create执行的时候,因为每一次就是一条 SQL 语句。大量数据的插入会很影响速度和执行时间。相比之下insert直接,快速,一步到位。

    模型工厂

    手动为每个模型填充指定属性很麻烦。作为替代方案,你可以使用 模型工厂 来轻松地生成大量数据库数据。laravel5.5默认的模型工厂。

    img
    <?php
    
    use Faker\Generator as Faker;
    
    /*
    |--------------------------------------------------------------------------
    | Model Factories
    |--------------------------------------------------------------------------
    |
    | This directory should contain each of the model factory definitions for
    | your application. Factories provide a convenient way to generate new
    | model instances for testing / seeding your application's database.
    |
    */
    
    $factory->define(App\Model\Book::class, function (Faker $faker) {
        return [
            'name' => $faker->name,
            'email' => $faker->unique()->safeEmail,
            'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
            'remember_token' => str_random(10),
        ];
    });
    

    在作为工厂定义的闭包中,你可以返回模型上所有属性的默认测试值。 闭包将接收 PHP 函数库 Faker 的一个实例,它允许你方便地生成各种随机数据进行测试。

    /**
     * @property string $name
     * @method string name(string $gender = null)
     * @property string $firstName
     * @method string firstName(string $gender = null)
     * @property string $firstNameMale
     * @property string $firstNameFemale
     * @property string $lastName
     * @property string $title
     * @method string title(string $gender = null)
     * @property string $titleMale
     * @property string $titleFemale
     *
     * @property string $citySuffix
     * @property string $streetSuffix
     * @property string $buildingNumber
     * @property string $city
     * @property string $streetName
     * @property string $streetAddress
     * @property string $postcode
     * @property string $address
     * @property string $country
     * @property float  $latitude
     * @property float  $longitude
     *
     * @property string $ean13
     * @property string $ean8
     * @property string $isbn13
     * @property string $isbn10
     *
     * @property string $phoneNumber
     *
     * @property string $company
     * @property string $companySuffix
     * @property string $jobTitle
     *
     * @property string $creditCardType
     * @property string $creditCardNumber
     * @method string creditCardNumber($type = null, $formatted = false, $separator = '-')
     * @property \DateTime $creditCardExpirationDate
     * @property string $creditCardExpirationDateString
     * @property array $creditCardDetails
     * @property string $bankAccountNumber
     * @method string iban($countryCode = null, $prefix = '', $length = null)
     * @property string $swiftBicNumber
     * @property string $vat
     *
     * @property string $word
     * @property string|array $words
     * @method string|array words($nb = 3, $asText = false)
     * @property string $sentence
     * @method string sentence($nbWords = 6, $variableNbWords = true)
     * @property string|array $sentences
     * @method string|array sentences($nb = 3, $asText = false)
     * @property string $paragraph
     * @method string paragraph($nbSentences = 3, $variableNbSentences = true)
     * @property string|array $paragraphs
     * @method string|array paragraphs($nb = 3, $asText = false)
     * @property string $text
     * @method string text($maxNbChars = 200)
     *
     * @method string realText($maxNbChars = 200, $indexSize = 2)
     *
     * @property string $email
     * @property string $safeEmail
     * @property string $freeEmail
     * @property string $companyEmail
     * @property string $freeEmailDomain
     * @property string $safeEmailDomain
     * @property string $userName
     * @property string $password
     * @method string password($minLength = 6, $maxLength = 20)
     * @property string $domainName
     * @property string $domainWord
     * @property string $tld
     * @property string $url
     * @property string $slug
     * @method string slug($nbWords = 6, $variableNbWords = true)
     * @property string $ipv4
     * @property string $ipv6
     * @property string $localIpv4
     * @property string $macAddress
     *
     * @property int       $unixTime
     * @property \DateTime $dateTime
     * @property \DateTime $dateTimeAD
     * @property string    $iso8601
     * @property \DateTime $dateTimeThisCentury
     * @property \DateTime $dateTimeThisDecade
     * @property \DateTime $dateTimeThisYear
     * @property \DateTime $dateTimeThisMonth
     * @property string    $amPm
     * @property string    $dayOfMonth
     * @property string    $dayOfWeek
     * @property string    $month
     * @property string    $monthName
     * @property string    $year
     * @property string    $century
     * @property string    $timezone
     * @method string amPm($max = 'now')
     * @method string date($format = 'Y-m-d', $max = 'now')
     * @method string dayOfMonth($max = 'now')
     * @method string dayOfWeek($max = 'now')
     * @method string iso8601($max = 'now')
     * @method string month($max = 'now')
     * @method string monthName($max = 'now')
     * @method string time($format = 'H:i:s', $max = 'now')
     * @method int unixTime($max = 'now')
     * @method string year($max = 'now')
     * @method \DateTime dateTime($max = 'now', $timezone = null)
     * @method \DateTime dateTimeAd($max = 'now', $timezone = null)
     * @method \DateTime dateTimeBetween($startDate = '-30 years', $endDate = 'now')
     * @method \DateTime dateTimeInInterval($date = '-30 years', $interval = '+5 days', $timezone = null)
     * @method \DateTime dateTimeThisCentury($max = 'now', $timezone = null)
     * @method \DateTime dateTimeThisDecade($max = 'now', $timezone = null)
     * @method \DateTime dateTimeThisYear($max = 'now', $timezone = null)
     * @method \DateTime dateTimeThisMonth($max = 'now', $timezone = null)
     *
     * @property string $md5
     * @property string $sha1
     * @property string $sha256
     * @property string $locale
     * @property string $countryCode
     * @property string $countryISOAlpha3
     * @property string $languageCode
     * @property string $currencyCode
     * @property boolean $boolean
     * @method boolean boolean($chanceOfGettingTrue = 50)
     *
     * @property int    $randomDigit
     * @property int    $randomDigitNotNull
     * @property string $randomLetter
     * @property string $randomAscii
     * @method int randomNumber($nbDigits = null, $strict = false)
     * @method int|string|null randomKey(array $array = array())
     * @method int numberBetween($min = 0, $max = 2147483647)
     * @method float randomFloat($nbMaxDecimals = null, $min = 0, $max = null)
     * @method mixed randomElement(array $array = array('a', 'b', 'c'))
     * @method array randomElements(array $array = array('a', 'b', 'c'), $count = 1, $allowDuplicates = false)
     * @method array|string shuffle($arg = '')
     * @method array shuffleArray(array $array = array())
     * @method string shuffleString($string = '', $encoding = 'UTF-8')
     * @method string numerify($string = '###')
     * @method string lexify($string = '????')
     * @method string bothify($string = '## ??')
     * @method string asciify($string = '****')
     * @method string regexify($regex = '')
     * @method string toLower($string = '')
     * @method string toUpper($string = '')
     * @method Generator optional($weight = 0.5, $default = null)
     * @method Generator unique($reset = false, $maxRetries = 10000)
     * @method Generator valid($validator = null, $maxRetries = 10000)
     *
     * @method integer biasedNumberBetween($min = 0, $max = 100, $function = 'sqrt')
     *
     * @property string $macProcessor
     * @property string $linuxProcessor
     * @property string $userAgent
     * @property string $chrome
     * @property string $firefox
     * @property string $safari
     * @property string $opera
     * @property string $internetExplorer
     * @property string $windowsPlatformToken
     * @property string $macPlatformToken
     * @property string $linuxPlatformToken
     *
     * @property string $uuid
     *
     * @property string $mimeType
     * @property string $fileExtension
     * @method string file($sourceDirectory = '/tmp', $targetDirectory = '/tmp', $fullPath = true)
     *
     * @method string imageUrl($width = 640, $height = 480, $category = null, $randomize = true, $word = null, $gray = false)
     * @method string image($dir = null, $width = 640, $height = 480, $category = null, $fullPath = true, $randomize = true, $word = null)
     *
     * @property string $hexColor
     * @property string $safeHexColor
     * @property string $rgbColor
     * @property array $rgbColorAsArray
     * @property string $rgbCssColor
     * @property string $safeColorName
     * @property string $colorName
     *
     * @method string randomHtml($maxDepth = 4, $maxWidth = 4)
     *
     */
    

    那么Seeder的写法就是这个样子

    public function run()
        {
          $books = factory(\App\Model\Book::class)->times(10)->make();
          \App\Model\Book::insert($books->toArray());
        }
    
    注意
    • DatabaseSeederd 的 factory() 中的Model和 UserFactory $factory->define() Model是一致的。
    • time() 方法用来控制添加数据的数量
    • make() 方法创建模型 对数据库不做操作。
    模型关联

    两个模型具有外键的关联关系,想要同时生成。Book生成一条数据,并将id赋值Author中的book_id字段。

    $factory->define(App\Model\Author::class, function (Faker $faker) {
        return [
            'book_id' => function () {
                return factory(App\Model\Book::class)->create()->id;
            },
            'author' => $faker->name,
        ];
    });
    
    执行seed
    // 执行seeder
    php artisan db:seed
    
    // 执行特定一个seeder
    php artisan db:seed --class=DatabaseSeeder
    
    衍生

    查看数据库,我们会发现插入到信息都是英文格式

    img
    img

    我们可以根据修改配置文件,使它随机信息变为中文。
    我们只需要在 config/app.php 添加 'faker_locale' => 'zh_CN', 即可。

    img
    img

    相关文章

      网友评论

        本文标题:[技术分享] 你知道 laravel 的数据填充是什么东东嘛

        本文链接:https://www.haomeiwen.com/subject/vtlnwqtx.html