<?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的实现做了以下几点:
- 首先获取所有的Company记录。
- 检查是否存在 Company 记录。如果没有,输出提示信息并退出。
- 使用 for 循环创建10条 Manager 记录。
- 对于每条记录,随机选择一个 Company。
- 创建 Manager 记录,包括名称、邮箱、密码(使用
Hash::make加密)、公司ID和remember_token。 - 最后输出成功信息。
要运行这个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() 方法来处理公司名称,生成一个适合用作域名后缀的字符串。让我详细解释一下:
Str::slug()是Laravel提供的一个辅助函数,用于将字符串转换为URL友好的格式。- 它主要做以下几件事:
- 将字符串转换为小写
- 将非字母数字字符替换为连字符(-)
- 移除多余的连字符
- 移除首尾的连字符
- 对于中文字符,它会尝试将其转换为拼音。
- 例如,对于不同的公司名称,这个方法会产生以下结果:
- '速达物流' -> 'su-da-wu-liu'
- '环球快递' -> 'huan-qiu-kuai-di'
- '星际运输' -> 'xing-ji-yun-shu'
- 例如,对于不同的公司名称,这个方法会产生以下结果:
这样处理后的字符串适合用作域名的一部分,因为它们:
- 不包含空格或特殊字符
- 全部是小写字母
- 使用连字符分隔单词
在实际应用中,这个 suffix_domain 可能会用于生成每个公司的子域名或者作为URL的一部分,例如:
http://su-da-wu-liu.example.comhttp://example.com/company/su-da-wu-liu
这种处理方式可以确保生成的URL是有效的,并且对搜索引擎友好。
