如何生成动态Laravel Nova选择字段?

时间:2019-12-30 17:16:52

标签: laravel laravel-6 laravel-nova

我正在尝试创建一个动态的Laravel Nova选择字段,但是遇到了一些问题。

我的配置文件中有一个数组,试图用来生成这些值。这是我的代码:

Select::make('Options')->options(function () {
    $options = config('options.options');
    $optionsArray = [];
    foreach($options as $index => $option) {
        $optionsArray[$index] = $option;
    }
    return [
        $optionsArray
    ];
}),

但是,这似乎不起作用。 $optionsArray填充了我想要的所有值,但是select字段在前端的Nova中没有选项。我该如何工作?

2 个答案:

答案 0 :(得分:0)

对于其他为此苦苦挣扎的人,解决方案是在返回时将pk包装在$optionsArray方法中,就像这样:

array_filter

答案 1 :(得分:0)

您当前的解决方案比实际需要的更为复杂。考虑以下代码段,它是解决方案的通用版本:

$input = [
    'a' => 123,
    'b' => 234,
    'c' => 'ABC'
];
$output = [];

foreach($input as $index => $option) {
    $output[$index] = $option;
}

转储$input$output实际上会产生相同的结果:

array(3) {
  ["a"]=>
  int(123)
  ["b"]=>
  int(234)
  ["c"]=>
  string(3) "ABC"
}
array(3) {
  ["a"]=>
  int(123)
  ["b"]=>
  int(234)
  ["c"]=>
  string(3) "ABC"
}

这意味着我们可以简单地省略此步骤,这将使我们进入以下中介解决方案:

Select::make('Options')->options(function () {
    return config('options.options');
})

由于->options($opts)对象上的Select函数接受一系列选项作为回调函数的替代,因此我们可以简单地将config('options.options')传递给它。为了确保在缺少配置时代码不会中断,我们还可以通过将[]用作第二个参数来将其用作默认值:

Select::make('Options')->options(config('options.options', []))

如果将嵌套数组传递给->options($opts)方法(或从传递的回调中返回一个),则将创建选择选项组。如果要对选择框的选项进行分组,例如,按国家对城市进行分组,这很方便:

Austria
  Vienna
  Bregenz
Germany
  Berlin
  Hamburg
United States
  New York
  Los Angeles
  Detroit

为此,您需要选择以下形式的数组,其中数组键用作内部存储值,并且可以自由更改:

[
    'vienna' => ['label' => 'Vienna', 'group' => 'Austria'],
    'bregenz' => ['label' => 'Bregenz', 'group' => 'Austria'],
    'berlin' => ['label' => 'Berlin', 'group' => 'Germany'],
    'hamburg' => ['label' => 'Hamburg', 'group' => 'Germany'],
    'new_york' => ['label' => 'New York', 'group' => 'United States'],
    'los_angeles' => ['label' => 'Los Angeles', 'group' => 'United States'],
    'detroit' => ['label' => 'Detroit', 'group' => 'United States'],
]

通过在选项上使用array_filter($opts),然后在回调中返回它们,您将删除名为null的选项。这仅在具有动态选项的动态环境中才有意义。