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

Posted

技术标签:

【中文标题】在州内创建工厂并在 Laravel 中获取自身的 id【英文标题】:Creating a factory inside the state and getting the id of itself in Laravel 【发布时间】:2019-04-17 12:16:09 【问题描述】:

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

出价

id, amount, created_at, updated_at, user_id

那我还有一个模型如下:

投标日志

id, bid_status, created_at, updated_at, bid_id

数据库结构非常简单。问题是 BidLog 只会在 Bid 的事件监听器中创建。它仅在 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】:

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

这样使用

$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。我想要的是这样的 $this->id; @WaiYanHein 我更新了我的答案,我认为这对你有用【参考方案2】:

我也遇到了同样的问题所以,我用示例代码分享示例

假设,我有 Income 表 用于保存总收入,还有 income_records 另一个表用于表示 Income 表数据的详细数据

收入表

id, date, amount, created_at, updated_at

收入记录

id, income_id , etc... many more other data fields

现在,我想使用 Laravel Factory 输入虚假的测试数据,然后你可以像下面这样从收入表的主键中获取名为外键的income_id

这里有 Income 收入表模型和 IncomeRecord 收入记录表模型

现在我在 DatabaseSeeder 类文件的 run() 函数中编写以下代码

 <?php 
  $incomes = Income::factory(10)
            ->create(); // fake plot's Income create for companies
 
  $incomes->each(function($income) 
        IncomeRecord::factory()
                 ->state([
                        'income_id' => $income->id,
                 ])->create();
  );
 ?>

希望这篇文章对你有帮助……

注意:- 我使用的是 Laravel 8 版本...它可能不适用于以下版本。所以,请测试它的其他版本如果它的作品,那么请编辑我关于 Laravel 版本详细信息的答案

【讨论】:

以上是关于在州内创建工厂并在 Laravel 中获取自身的 id的主要内容,如果未能解决你的问题,请参考以下文章

选择条件列但获取子查询返回超过 1 个值

确定地理点是不是在州边界的 X 米内(使用 shapefile 获取边界数据)

不能在 Laravel 8 中使用遗留工厂

Laravel 工厂用户 ID 始终为空

Laravel 8 工厂类在创建工厂时不会覆盖参数

Laravel - 向工厂创建的模型添加关系