如何在Laravel中使用口才关系进行多层次播种?

ffx8fchx  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(154)

这是表的结构

  • 表A
  • 表B具有外键a_id
  • 表C具有外键a_id和b_id

我正尝试在这三个表中播种雄辩的关系
下面是我的代码结构

class A extends Model
{
    use HasFactory;

    protected $fillable = [...];

    public function b()
    {
        return $this->hasMany(B::class);
    }

    public function c()
    {
        return $this->hasMany(C::class);
    }
}
class B extends Model
{
    use HasFactory;

    protected $fillable = [...];

    public function c()
    {
        return $this->hasMany(C::class);
    }
}
class C extends Model
{
    use HasFactory;

    protected $fillable = [...];
}
class DatabaseSeeder extends Seeder
{
    public function run()
    {
        \App\Models\A::factory(5)
            ->has(\App\Models\B::factory(2))
            ->has(\App\Models\C::factory(1))
            ->create();
    }
}

错误:
数据库状态[HY000]:一般错误:1364字段'b_id'没有默认值(SQL:插入到c(... a_idupdated_atcreated_at

7gcisfzg

7gcisfzg1#

您的播种机将创建5个A模型。
对于这5个A,它将尝试执行两项操作

  • 创建2个B,传入a_id
  • 创建1个C,传入a_id,但不传入任何b_id

下面是每一个A模型的外观。

// A model
{
    id: 1
    b: [
        // B model
        {
            id: 1,
            a_id: 1
        },
        // B model
        {
            id: 2,
            a_id: 1
        },
    ],
    c: [
        // C model
        {
            id: 1,
            a_id: 1,
        ->  b_id: null <- This will throw the error because b_id is not a nullable column
        },
    ],
}

要修复它,您需要删除has(\App\Models\C::class)或创建一个B模型与之关联。
您需要定义belongsTo关系才能使其工作。
x一个一个一个一个x一个一个二个x
例如

use App\Models\A;
use App\Models\B;
use App\Models\C;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $b = B::factory()->for(A::factory())->create();

        A::factory(5)
            ->has(B::factory(2))
            ->has(C::factory(1)->for($b))
            ->create();
    }
}

您也不能在一条语句中创建所有内容。

use App\Models\A;
use App\Models\B;
use App\Models\C;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $A_models = A::factory(5)
            ->has(B::factory(2))
            ->create();

        foreach ($A_models as $A) {
            $b_id = $A->b->pluck('id')->random();
            $c = C::factory()->make(['b_id' => $b_id]);

            $a->c()->save($c);
        }
    }
}

相关问题