我正在尝试为BlogPost模型创建一个工厂。
一篇博客文章belongsToMany Tag,反之亦然。
有一个中间表(blog_post_tag)来存储博客帖子与标签的关系。
我想用一些标签名来播种一篇博客文章。
如何使用工厂和中间表作为DB的种子?
可能有一个答案here
因此,我可以将以下内容添加到我的BlogPost种子中。这也会创建标签,但我想获得现有的标签(最好是3-5,只有存在的话)。
hasAttached()接受工厂作为第一个参数,因此这将不起作用。
BlogPost::factory()
->hasAttached(
Tag::factory()->count(3)
)
->create();发布于 2021-02-25 19:22:30
这就是我如何用现有数据填充我的关系:
<?php
namespace Database\Factories;
use App\Models\Alpha;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
use App\Models\Beta;
use App\Models\Gamma;
class AlphaFactory extends Factory {
protected $model = Alpha::class;
public function definition() {
$beta_ids = Beta::all()->pluck('id');
$gamma_ids = Gamma::all()->pluck('id');
return [
'name' => Str::slug($this->faker->unique()->realText(50)),
'number' => $this->faker->randomNumber(3),
'beta_id' => $this->faker->randomElement($beta_ids),
'gamma_id' => $this->faker->randomElement($gamma_ids)
];
}
}如果你想变得花哨一些,有时会创建一些新的条目与之相关:
<?php
namespace Database\Factories;
use App\Models\Alpha;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
use App\Models\Beta;
class AlphaFactory extends Factory {
protected $model = Alpha::class;
public function definition() {
$beta_id;
$beta_ids = Beta::all()->pluck('id');
if($beta_ids->isEmpty() || $this->faker->boolean($chanceOfGettingTrue = 50)) {
$beta_id = Beta::factory()->create()->id;
} else {
$beta_id = $this->faker->randomElement($beta_ids);
}
return [
'name' => Str::slug($this->faker->unique()->realText(50)),
'number' => $this->faker->randomNumber(3),
'beta_id' => $beta_id
];
}
}我不知道这是否是正确的方法,但它对我很有效。如果有更好的办法,请告诉我。
https://stackoverflow.com/questions/66145738
复制相似问题