Laravel Nova Actions BelongsTo字段不工作

qv7cva1a  于 2023-04-22  发布在  其他
关注(0)|答案(4)|浏览(126)

我有这个简单的动作:

/**
 * 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关系中选择User并尝试保存异常时,会抛出:

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
mbzjlibv

mbzjlibv1#

是的,我知道我迟到了,但是--这里有一个解决方案:使用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);
}
7d7tgy0s

7d7tgy0s2#

也许我迟到了,但是,对于像我这样想要使用BelongsTo可搜索字段的人,因为他们想要搜索的模型包含太多记录,无法将它们打包在正常的Select字段中,这里是我找到的解决方案:
使用以下代码在App\Nova\Fields中创建一个类:

<?php

namespace App\Nova\Fields;

use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Http\Requests\NovaRequest;

class BelongsToForActions extends BelongsTo
{
    public function fillForAction(NovaRequest $request, $model)
    {
        $attribute = $this->attribute;

        if ($request->exists($attribute)) {
            $value = $request[ $attribute ];

            $model->{$attribute} = $this->isNullValue($value) ? null : $value;
        }
    }
}

然后像使用普通的BelongsTo字段一样使用它。只需记住在make上填写3个参数,例如:

BelongsToForActions::make('User', 'relation', \App\Nova\User::class)->searchable()

记住,“关系”必须存在。

0ve6wy6x

0ve6wy6x3#

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

public function fields()
{
    return [
        BelongsTo::make('User', 'user', User::class),
    ];
}
ojsjcaue

ojsjcaue4#

实际上,我通过模拟这个关系中使用的键值对来修复这个问题。
首先,我构建一个数组,ID列作为键,name列作为值。

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

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

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

相关问题