【发布时间】:2021-12-27 19:32:12
【问题描述】:
在 Laravel 8 中,当我在具有 __construct 的模型上运行 factory()->create() 时,此代码:
Route::get('/test', function (){
$doc = ClientDocument::factory()->create();
});
失败:
"SQLSTATE[HY000]: General error: 1364 Field 'filename' doesn't have a default value (SQL: insert into `client_documents` (`updated_at`, `created_at`) values (2021-11-16 12:45:20, 2021-11-16 12:45:20))"
如果我删除 __construct,工厂运行正常并保存到数据库中......我在这里缺少什么?谢谢!
型号
class ClientDocument extends Model
{
use HasFactory;
protected $connection = 'mysql';
protected $fillable = ['filename'];
protected $locale;
public function __construct() {
// SET THE LANGUAGE
if ( auth()->user() ) {
$this->locale = auth()->user()->locale;
} else {
$this->locale = 'en';
}
}
}
工厂
class ClientDocumentFactory extends Factory
{
public function definition()
{
$user = User::factory()->create();
$client = $user->createNewClientFile();
return [
'filename' => $this->faker->lexify('????????'),
];
}
}
迁移
class CreateClientDocumentsTable extends Migration
{
public function up()
{
Schema::create('client_documents', function (Blueprint $table) {
$table->id();
$table->string('filename');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('client_documents');
}
}
【问题讨论】:
-
Welcome to SO ... 模型已经定义了一个构造函数,它实际上做了一些事情,你只是覆盖了这个构造函数而不做任何事情(如果你定义了一个不做'不获取属性并填充模型?)...github.com/laravel/framework/blob/8.x/src/Illuminate/Database/…
-
你至少需要调用父构造函数,否则你的构造函数是空的,因此没用
-
无论我添加 parent::__construct() 还是 __construct 中的任何其他代码都不会改变任何东西,同样的错误。为了简单起见,我删除了代码……但也许我不应该这样做! ;) 我已经编辑了我的答案以使其更清晰
-
不仅仅是调用父构造函数。基类
Model的构造函数签名为public function __construct(array $attributes = []),因此您应该使构造函数与该签名兼容,并将可选的$attributes传递给父类 -
谢谢布赖恩·汤普森(和其他人)。我知道是这样的,只是找不到。谢谢大家。
标签: laravel constructor factory