首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel Seed多重关系

Laravel Seed多重关系
EN

Stack Overflow用户
提问于 2018-06-21 11:17:26
回答 2查看 1.9K关注 0票数 1

我有三种型号:MemberInvoicePayment

下面是Member模型:

代码语言:javascript
复制
class Member extends Model
{
     public function invoice()
     {
          return $this->hasOne(Invoice::class);
     }
}

Invoice模型中:

代码语言:javascript
复制
class Invoice extends Model
{
     public function member()
     {
        return $this->belongsTo(Member::class, 'member_id');
     }

     public function payments()
     {
        return $this->hasMany(Payment::class, 'invoice_id');
     }
}

最后是Payment模型:

代码语言:javascript
复制
class Payment extends Model
{
     public function invoice()
     {
          return $this->belongsTo(Invoice::class, 'invoice_id');
     }
}

现在,在我的种子中,我想为每个成员的每一张发票创建一笔付款:

代码语言:javascript
复制
public function run()
{
   factory(Member::class, 100)->create()->each(function ($m) {
       $m->invoice()->save(factory(App\Invoice::class)->create()->each(function ($i) {
           $i->payments()->save(factory(App\Payment::class)->make());
     }));
  });
}

但是当我尝试播种时,它会返回一个错误:

代码语言:javascript
复制
Symfony\Component\Debug\Exception\FatalThrowableError  : Type error: Argument 1 passed to Illuminate\Database\Eloquent\Relations\HasOneOrMany::save() must be an instance of Illuminate\Database\Eloquent\Model, boolean given

我如何才能实现我想要的输出?

EN

回答 2

Stack Overflow用户

发布于 2018-06-21 11:51:42

参考- Factory CallbackssaveMany function

现在,在您的MemberFactory.php,中添加以下内容

代码语言:javascript
复制
$factory->afterCreating(App\Member::class, function ($member, $faker) {
  $member->invoice()->save(factory(App\Invoice::class)->make());
});

在you InvoiceFactory.php,中添加以下内容

代码语言:javascript
复制
$factory->afterMaking(App\Invoice::class, function ($invoice, $faker) {
  $invoice->payments()->saveMany(factory(App\Payment::class, 5)->make());
});

最后,在run()函数中,执行

代码语言:javascript
复制
public function run()
{
  factory(Member::class, 100)->create();
}

尚未测试,但应该可以工作:)

另外,我认为你的关系中不需要第二个参数。如果您使用的是单一命名法,该函数应该能够自动获得外键匹配。

票数 3
EN

Stack Overflow用户

发布于 2020-07-17 14:32:07

在you seed/Databaseeder.php中(在Laravel 7中测试)

代码语言:javascript
复制
public function run()
    {
        factory(App\Member::class, 100)->create()->each(function ($m) {
            // Seed the relation with one address
            $invoice = factory(App\Invoice::class)->make();
            $payments = factory(App\Payment::class,5)->make();
            $m->invoice()-save($invoice);
            $invoice->payments()->saveMany($payments)
        });
    }

run函数表示为每个成员模型创建100个成员模型实例,创建一个发票模型,并为每个发票创建5个付款模型

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

https://stackoverflow.com/questions/50959872

复制
相关文章

相似问题

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