Laravel Nova Actions BelongsTo 字段不起作用

Posted

技术标签:

【中文标题】Laravel Nova Actions BelongsTo 字段不起作用【英文标题】:Laravel Nova Actions BelongsTo field not working 【发布时间】:2021-03-19 19:48:11 【问题描述】:

我有这个简单的动作:

/**
 * Perform the action on the given models.
 *
 * @param  \Laravel\Nova\Fields\ActionFields  $fields
 * @param  \Illuminate\Support\Collection  $models
 * @return mixed
 */
public function handle(ActionFields $fields, Collection $models)

    foreach ($models as $model) 
        $model->update([
            'user_id' => $fields->user
        ]);
    


/**
 * Get the fields available on the action.
 *
 * @return array
 */
public function fields()

    return [
        BelongsTo::make('User', 'user', User::class),
    ];

起初,它似乎很好,但是当我从 BelongsTo 关系中选择用户并尝试保存时抛出异常:

Argument 1 passed to Laravel\Nova\Fields\BelongsTo::getRelationForeignKeyName() must be an instance of Illuminate\Database\Eloquent\Relations\Relation, instance of Illuminate\Support\Fluent given, called in /Users/rd/Sites/bns-crm/vendor/laravel/nova/src/Fields/BelongsTo.php on line 212

【问题讨论】:

【参考方案1】:

检查您的命名空间。您是否导入了正确的课程?用户类必须是资源类

public function fields()

    return [
        BelongsTo::make('User', 'user', User::class),
    ];

【讨论】:

是的,没关系。问题是您不能这样做,请在操作字段中使用关系。 嘿,您找到解决方案了吗? @RomkaLTU 你对此有什么参考吗?【参考方案2】:

我实际上是通过模拟此关系中使用的键值对来解决此问题的。

首先我构建了一个数组,其中 ID 列作为键,名称列作为值。

$clients = Client::all()
  ->keyBy('id')
  ->map(fn($client): string => $client['name'])
  ->toArray();

然后我使用 Select nova 字段来显示它。

Select::make('Klant', 'client')
  ->searchable()
  ->options($clients)
  ->rules('required'),

【讨论】:

【参考方案3】:

是的,我知道我迟到了,但是 - 这是一个解决方案: 使用 Select-Field 而不是 BelongsTo 并选择您的选项来构建键值对:

public function fields()

    return [
        Select::make('debitor')->options(\App\Models\Debitor::pluck('Name', 'id'))
    ];

然后你应该在句柄中获取 $fields 中的 id:

public function handle(ActionFields $fields, Collection $models) 
    Log::info($fields);

【讨论】:

以上是关于Laravel Nova Actions BelongsTo 字段不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Nova 中的自定义 Vue 组件

markdown Laravel Nova

php 在Laravel Nova资源中覆盖标签

有没有办法在 Laravel 中为 Nova 资源显式定义策略?

markdown 与Laravel Nova合作的注意事项。

Laravel Nova 无法与 Laravel Spark 一起使用:位置 1213 的 JSON 中出现意外的令牌 P