如何为Laravel Nova字段指定默认值?

时间:2019-12-05 14:46:25

标签: laravel relationship laravel-nova

我想将资源字段的默认值设置为经过身份验证的用户的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', 'App\Nova\User')->hideWhenCreating()->hideWhenUpdating(),
DateTime::make('Created At', 'created_at')->hideWhenCreating(),
DateTime::make('Updated At', 'updated_at')->hideWhenCreating(),

因为我引用了Note Nova资源上的Game,所以当我创建Note时,game_id列已正确填充。但是,我希望user_id列是经过身份验证的用户的值。它似乎无法正常工作,我该怎么办?

2 个答案:

答案 0 :(得分:1)

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

我认为这种方式是不可能的。一旦使用hide函数,这些字段就不会呈现,并且永远不会随请求一起传递。我尝试了此操作,user_id字段从未随请求一起发送。

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

在表单中显示该字段,并使用元数据设置默认值(也许可以将该字段设置为只读,以方便使用)。

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

See this part of the Nova docs

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

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

当然,上述方法有点简单。使用适当的事件侦听器会更好。

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

答案 1 :(得分:0)

您可以使用方法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';
});