在州内创建工厂并在 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的主要内容,如果未能解决你的问题,请参考以下文章