在州内创建了一家工厂,并在拉维尔获得了自己的ID [英] Creating a factory inside the state and getting the id of itself in Laravel

查看:15
本文介绍了在州内创建了一家工厂,并在拉维尔获得了自己的ID的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个Laravel应用程序。我在我的应用程序中使用工厂,专门用于单元测试和设置它们,但我在使用State设置工厂时遇到了问题。以下是我的数据库结构:

竞价

id, amount, created_at, updated_at, user_id

然后我有另一个模型,如下所示:

BidLog

id, bid_status, created_at, updated_at, bid_id

数据库结构非常简单。问题是,BidLog只会在竞标的事件侦听器中创建。只有在竞标存在的情况下,它才存在。这基本上是竞标的状态。因此,当我为BidLog设置工厂时,我设置了如下内容。

BidLogFactory.php

$factory->define(BidLog::class, function (Faker $faker) {
    $bid = Bid::inRandomOrder()->first();
    return [
        'bid_id' => $bid->id,
        'bid_status' => 'open'//Bid factory will override this value
    ];
});

然后我将BidFactory的状态设置如下。

$factory->state(Bid::class, 'open', function ($faker) {
    $bidLog = factory(BidLog::class)->create([
       'bid_status' => 'open',
       'bid_id' => //how can I get the bid id here?
    ]);
    return [
       'updated_at' => now()
    ];
});
问题是如何在状态回调函数中获取BID?或者我如何设置它?

推荐答案

使用回调函数(闭包)传递

那样使用

$factory->state(Bid::class, 'open', function ($faker) {
    $bidLog = factory(BidLog::class)->create([
       'bid_status' => 'open',
       'bid_id' => function(){
           return   Bid::inRandomOrder()->first()->id;
        }
    ]);
    return [
       'updated_at' => now()
    ];
});

使用此处的afterCreatingState方法see

$factory->state(Bid::class, 'open', [])
        ->afterCreatingState(Bid::class,'open',function($bid,$faker) { 
              factory(BidLog::class)->create([
                  'bid_status' => 'open',
                  'bid_id' => $bid->id
             ]);
         });

这篇关于在州内创建了一家工厂,并在拉维尔获得了自己的ID的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆