VuePressVuePress
首页
  • 基础
  • UI
  • JavaScript
  • CSS
  • postcss
  • Vue3
  • Vue的设计与实现
  • 前端常用插件
  • PHP
  • Laravel
  • Linux
  • 线性代数
Category
AI
jiyun
Timeline
首页
  • 基础
  • UI
  • JavaScript
  • CSS
  • postcss
  • Vue3
  • Vue的设计与实现
  • 前端常用插件
  • PHP
  • Laravel
  • Linux
  • 线性代数
Category
AI
jiyun
Timeline
  • 基础知识

    • 表单验证
    • 限流1
  • 请求

    • request
  • 认证

    • auth
  • 验证

    • fail
  • migrations

    • migration
  • eloquent

    • eloquent
    • updateOrCreate
  • seeder

    • seeder
    • seeder2
      • 解释
  • 套件

    • precognition
  • 进阶

    • Cache 缓存
  • 最佳实践

    • CRUD 最佳实践
    • 将用户定位到他的前缀域名
    • 服务类仓储类查询类
    • 接口和实现
    • laravel 中 trait 引导机制
    • 使用阿里云oss上传图片
  • plugins

    • IDE Helper Generator for Laravel
<?php

namespace Database\Seeders;

use App\Models\Manager;
use App\Models\Company;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

class ManagerConfigSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        $companies = Company::all();

        if ($companies->isEmpty()) {
            $this->command->info('没有找到公司记录。请先运行 CompanySeeder。');
            return;
        }

        for ($i = 0; $i < 10; $i++) {
            $company = $companies->random();
            
            Manager::create([
                'name' => '管理员' . ($i + 1),
                'email' => 'manager' . ($i + 1) . '@example.com',
                'password' => Hash::make('password'),
                'company_id' => $company->id,
                'remember_token' => Str::random(10),
            ]);
        }

        $this->command->info('成功创建了10条Manager记录。');
    }
}

这个seeder的实现做了以下几点:

  1. 首先获取所有的Company记录。
  2. 检查是否存在 Company 记录。如果没有,输出提示信息并退出。
  3. 使用 for 循环创建10条 Manager 记录。
  4. 对于每条记录,随机选择一个 Company。
  5. 创建 Manager 记录,包括名称、邮箱、密码(使用Hash::make加密)、公司ID和remember_token。
  6. 最后输出成功信息。

要运行这个seeder,您可以使用以下命令:

php artisan db:seed --class=ManagerConfigSeeder

请注意,在运行这个seeder之前,确保已经运行了CompanySeeder,以确保数据库中有Company记录。

随机生成5个Company

<?php

namespace Database\Seeders;

use App\Models\Company;
use Illuminate\Database\Seeder;
use Illuminate\Support\Str;
use Faker\Factory as Faker;

class CompanySeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        
        $companyNames = ['速达物流', '环球快递', '星际运输', '海陆空物流', '智能配送'];

        $faker = Faker::create('zh_CN');

        foreach ($companyNames as $name) {
            Company::create([
                'name' => $name,
                'suffix_domain' => Str::slug($name),
                // 'description' => $name . '是一家专业的物流公司',
                'description' => $faker->paragraph(3),// 使用$faker->paragraph(3)来生成一个包含3个句子的段落作为描述
                'email' => Str::slug($name) . '@example.com',
            ]);
        }

        $this->command->info('成功创建了5个Company记录。');
    }
}

如果您想要更具体的物流相关描述,我们可以创建一个自定义的描述生成器。例如:

<?php

namespace Database\Seeders;

use App\Models\Company;
use Illuminate\Database\Seeder;
use Illuminate\Support\Str;
use Faker\Factory as Faker;

class CompanySeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        $faker = Faker::create('zh_CN');

        $companyNames = ['速达物流', '环球快递', '星际运输', '海陆空物流', '智能配送'];

        foreach ($companyNames as $name) {
            Company::create([
                'name' => $name,
                'suffix_domain' => Str::slug($name),
                'description' => $this->generateLogisticsDescription($faker),
                'email' => Str::slug($name) . '@example.com',
            ]);
        }

        $this->command->info('成功创建了5个Company记录。');
    }

    /**
     * 生成物流公司描述
     */
    private function generateLogisticsDescription($faker): string
    {
        $services = ['国内快递', '国际快递', '仓储服务', '供应链解决方案', '冷链物流', '大件运输'];
        $features = ['快速', '可靠', '安全', '高效', '创新', '专业'];
        $coverages = ['全国', '全球', '亚太地区', '欧美市场'];

        return sprintf(
            '%s是一家专业的物流公司,成立于%d年。我们提供%s等服务,以%s著称。我们的业务覆盖%s,致力于为客户提供最优质的物流解决方案。',
            $faker->company,
            $faker->numberBetween(1990, 2020),
            $faker->randomElements($services, 2),
            $faker->randomElements($features, 2),
            $faker->randomElement($coverages)
        );
    }
}
<?php

namespace Database\Seeders;

use App\Models\Manager;
use App\Models\Company;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

class ManagerConfigSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        $companies = Company::all();

        if ($companies->isEmpty()) {
            $this->command->info('没有找到公司记录。正在运行 CompanySeeder...');
            $this->call(CompanySeeder::class);
            $companies = Company::all();
        }

        for ($i = 0; $i < 10; $i++) {
            $company = $companies->random();
            
            Manager::create([
                'name' => '管理员' . ($i + 1),
                'email' => 'manager' . ($i + 1) . '@' . $company->suffix_domain . '.com',
                'password' => Hash::make('password'),
                'company_id' => $company->id,
                'remember_token' => Str::random(10),
            ]);
        }

        $this->command->info('成功创建了10条Manager记录。');
    }
}

解释

这行代码使用了Laravel的 Str::slug() 方法来处理公司名称,生成一个适合用作域名后缀的字符串。让我详细解释一下:

  1. Str::slug() 是Laravel提供的一个辅助函数,用于将字符串转换为URL友好的格式。
  2. 它主要做以下几件事:
    1. 将字符串转换为小写
    2. 将非字母数字字符替换为连字符(-)
    3. 移除多余的连字符
    4. 移除首尾的连字符
  3. 对于中文字符,它会尝试将其转换为拼音。
    1. 例如,对于不同的公司名称,这个方法会产生以下结果:
      • '速达物流' -> 'su-da-wu-liu'
      • '环球快递' -> 'huan-qiu-kuai-di'
      • '星际运输' -> 'xing-ji-yun-shu'

这样处理后的字符串适合用作域名的一部分,因为它们:

  • 不包含空格或特殊字符
  • 全部是小写字母
  • 使用连字符分隔单词

在实际应用中,这个 suffix_domain 可能会用于生成每个公司的子域名或者作为URL的一部分,例如:

  • http://su-da-wu-liu.example.com
  • http://example.com/company/su-da-wu-liu

这种处理方式可以确保生成的URL是有效的,并且对搜索引擎友好。

Last Updated:
Contributors: BaronYan
Prev
seeder