在州内创建工厂,并在Laravel中获取自己的id

在州内创建工厂,并在Laravel中获取自己的id,laravel,factory,Laravel,Factory,我正在开发一个Laravel应用程序。我在我的应用程序中使用工厂,特别是用于单元测试和设置工厂,但是我在与state一起设置工厂时遇到了问题。以下是我的数据库结构: 投标 然后我有另一个模型,如下所示: 比德洛格 数据库结构非常简单。问题是BidLog只会在Bid的事件侦听器中创建。只有当投标存在时,它才存在。这基本上是投标的状态。所以,当我为BidLog建立工厂时,我建立了类似这样的东西 $factory->state(Bid::class, 'open', function ($fak

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

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

比德洛格 数据库结构非常简单。问题是BidLog只会在Bid的事件侦听器中创建。只有当投标存在时,它才存在。这基本上是投标的状态。所以,当我为BidLog建立工厂时,我建立了类似这样的东西

$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()
    ];
});
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
    ];
});
然后我像这样设置工厂的状态

$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 id?或者我如何设置它

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

像那样使用

$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
方法(我想)了解更多信息


没有人。事实并非如此。它会给我随机的出价id。我想要的是这样的$this->id@WaiYanHein我更新了我的答案,我认为这将对你有用
$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()
    ];
});
$factory->state(Bid::class, 'open', [])
        ->afterCreatingState(Bid::class,'open',function($bid,$faker) { 
              factory(BidLog::class)->create([
                  'bid_status' => 'open',
                  'bid_id' => $bid->id
             ]);
         });