首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有中间表的Laravel工厂

带有中间表的Laravel工厂
EN

Stack Overflow用户
提问于 2021-02-11 06:00:26
回答 1查看 39关注 0票数 0

我正在尝试为BlogPost模型创建一个工厂。

一篇博客文章belongsToMany Tag,反之亦然。

有一个中间表(blog_post_tag)来存储博客帖子与标签的关系。

我想用一些标签名来播种一篇博客文章。

如何使用工厂和中间表作为DB的种子?

可能有一个答案here

因此,我可以将以下内容添加到我的BlogPost种子中。这也会创建标签,但我想获得现有的标签(最好是3-5,只有存在的话)。

hasAttached()接受工厂作为第一个参数,因此这将不起作用。

代码语言:javascript
复制
BlogPost::factory()
            ->hasAttached(
                Tag::factory()->count(3)
            )
            ->create();
EN

回答 1

Stack Overflow用户

发布于 2021-02-25 19:22:30

这就是我如何用现有数据填充我的关系:

代码语言:javascript
复制
<?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)
        ];
    }
}

如果你想变得花哨一些,有时会创建一些新的条目与之相关:

代码语言:javascript
复制
<?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
        ];
    }
}

我不知道这是否是正确的方法,但它对我很有效。如果有更好的办法,请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66145738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档