Laravel 8类模型工厂



我试图弄清楚为什么当我尝试创建Player类和dd($this)的工厂时,结果是它没有覆盖模型的状态。同样没有意义的是,它是各州的两个项目的集合。

有人能对此做出进一步澄清吗?

$player = Player::factory()->injured()->create();

<?php
namespace DatabaseFactories;
use AppEnumsPlayerStatus;
use AppModelsPlayer;
use CarbonCarbon;
use IlluminateDatabaseEloquentFactoriesFactory;
use IlluminateSupportStr;
class PlayerFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected string $modelClass = Player::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition(): array
{
return [
'name' => $this->faker->name,
'height' => $this->faker->numberBetween(60, 95),
'weight' => $this->faker->numberBetween(180, 500),
'hometown' => $this->faker->city.', '.$this->faker->state,
'status' => PlayerStatus::__default,
];
}
public function injured(): self
{
$this->state([
'status' => PlayerStatus::INJURED,
]);
dd($this);
$now = now();
$start = $now->copy()->subDays(2);
$this->hasEmployments(1, ['started_at' => $start]);
$this->hasInjuries(1, ['started_at' => $now]);
return $this;
}
}

^ DatabaseFactoriesPlayerFactory^ {#2650
#modelClass: "AppModelsPlayer"
#model: null
#count: null
#states: IlluminateSupportCollection^ {#2647
#items: array:2 [
0 => Closure()^ {#2631
class: "IlluminateDatabaseEloquentFactoriesFactory"
this: DatabaseFactoriesPlayerFactory {#2626 …}
use: {
$state: []
}
}
1 => Closure()^ {#2646
class: "IlluminateDatabaseEloquentFactoriesFactory"
this: DatabaseFactoriesPlayerFactory {#2648 …}
use: {
$state: []
}
}
]
}
#has: IlluminateSupportCollection^ {#2610
#items: []
}
#for: IlluminateSupportCollection^ {#2640
#items: []
}
#afterMaking: IlluminateSupportCollection^ {#2455
#items: []
}
#afterCreating: IlluminateSupportCollection^ {#2453
#items: []
}
#connection: null
#faker: null
}

方法调用:

$this->state([
'status' => PlayerStatus::INJURED,
]);

不修改当前对象-它会创建一个具有更新的"status"的新Factory实例。这家新工厂应该以受损的方式归还。

在这种情况下,一种解决方案是:

public function injured(): self
{
$injuredPlayer = $this->state([
'status' => PlayerStatus::INJURED,
]);
$now = now();
$start = $now->copy()->subDays(2);
$injuredPlayer->hasEmployments(1, ['started_at' => $start]);
$injuredPlayer->hasInjuries(1, ['started_at' => $now]);
return $injuredPlayer;
}

最新更新