在州内创建工厂并在Laravel中获取自身的ID

时间:2018-11-14 13:48:18

标签: laravel factory

我正在开发Laravel应用程序。我现在在我的应用程序中使用工厂,尤其是用于单元测试和设置工厂。但是现在我在建立州工厂方面遇到了问题。请在下面查看我的数据库结构。

出价

id, amount, created_at, updated_at, user_id

然后我有另一个模型,如下。

BidLog

id, bid_status, created_at, updated_at, bid_id

数据库结构非常简单。问题是BidLog将仅在Bid的事件监听器中创建。仅在投标存在时才存在。基本上是出价状态。因此,当我为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 ID?或者如何设置?

1 个答案:

答案 0 :(得分:1)

  

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

那样使用

$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
             ]);
         });