如何为字段指定默认值 拉拉维尔诺瓦.



我想将资源字段的默认值设置为经过身份验证的用户的id。我有一个名为Note的模型,它与GameUser有一对多的关系。

User hasMany Note
Game hasMany Note
Note belongsTo User
Note belongsTo Game

在Laravel Nova中,我的田野看起来像这样

ID::make()->sortable(),
Text::make('Note', 'note')->onlyOnIndex(),
Textarea::make('Note', 'note')->alwaysShow(),
BelongsTo::make('Game', 'game')->hideWhenCreating()->hideWhenUpdating(),
BelongsTo::make('Created By', 'user', 'AppNovaUser')->hideWhenCreating()->hideWhenUpdating(),
DateTime::make('Created At', 'created_at')->hideWhenCreating(),
DateTime::make('Updated At', 'updated_at')->hideWhenCreating(),

因为我引用的是GameNova 资源上的Note,所以当我创建Note时,game_id列已正确填充。但是,我希望user_id列是经过身份验证的用户的值。它似乎不是这样工作的,我将如何完成它?

如果我从行中正确理解BelongsTo::make('Created By', 'user', 'AppNovaUser')->hideWhenCreating()->hideWhenUpdating()您正在尝试为列设置默认值而不在表单上显示字段?

我认为这不可能以这种方式实现。一旦您使用hide函数,字段就不会呈现,并且永远不会随请求一起传递。我试过这个,user_id字段从未随请求一起发送。

我认为有两种方法可以做到这一点:

在表单中显示字段并使用元数据设置默认值(并且可能使字段为只读以便于度量(。

BelongsTo::make('Created By', 'user', 'AppNovaUser')->withMeta([
"belongsToId" => auth()->user()->id,
])

请参阅新星文档的这一部分

或者使用雄辩creating事件。以下内容将进入您的 Note 模型。

public static function boot()
{
parent::boot();
static::creating(function($note)
{
$note->user_id = auth()->user()->id;
});
}

当然,上面的方法有点简单。你最好使用适当的事件侦听器。

旁注:从架构的角度来看,我会选择选项 2。在不让最终用户参与的情况下设置默认值听起来像是 Eloquent 模型的工作,而不是 Nova 表单的工作。

您可以使用方法resolveUsing()。一个例子

<?php
//...
Select::make('My Select', 'my_custom_name')
->options(['a' => 'a', 'b' => 'b', 'c' => 'c'])
->resolveUsing(function ($value, $resource, $attribute) {
// $value = model attribute value
// $attribute = 'my_custom_name'
return 'b';
});

最新更新