没有实际数据库列的表单上的 Laravel Nova 额外“图像”字段

Posted

技术标签:

【中文标题】没有实际数据库列的表单上的 Laravel Nova 额外“图像”字段【英文标题】:Laravel Nova extra 'images' field on forms without actual database column 【发布时间】:2020-05-21 21:30:58 【问题描述】:

创建额外字段“图像”资源表单通常会引发“找不到列”类型的数据库级错误。 但是,当提交创建/更新表单时,我需要资源表单上的这种类型的额外字段用于某些业务逻辑。

我尝试在资源上使用removeNonCreationFields 方法将该字段列从保存到数据库中删除,但不起作用并且仍然抛出错误。

请注意,->hideWhenCreating() or ->readonly() 不相关,因为我需要在创建/删除表单的该字段上进行交互。

有没有其他方法可以通过额外的字段使这种情况成功?请帮忙。谢谢。

【问题讨论】:

你找到解决办法了吗? @MiraThakkar 请看我的回答。 【参考方案1】:

Hasnat 方法非常适合我的情况。 在仅为内部逻辑创建资源时,我希望有一个特殊字段,它应该被忽略/丢弃,并且与数据库字段没有任何关系。 谢谢!

【讨论】:

【参考方案2】:

我的解决方案是:

app/Nova/Post.php

/**
 * @param  NovaRequest  $request
 * @param  \Illuminate\Database\Eloquent\Model  $model
 * @param  \Illuminate\Support\Collection  $fields
 * @return array|void
 */
protected static function fillFields(NovaRequest $request, $model, $fields)

    $fillFields = parent::fillFields($request, $model, $fields);

    // first element should be model object
    $modelObject = $fillFields[0];

    // remove all extra non-database attributes from the model
    unset($modelObject->to_profile_gallery);

    // I am not sure it will work if we unset on $model parameter and return it
    // But you should try first doing so on $model parameter and return $model

    return $fillFields;

然后你应该使用两个函数,一个用于如何保存在数据库中,另一个用于如何从数据库中检索特定数据。在额外的字段上使用这些。

->fillUsing(function($request, $model, $attribute, $requestAttribute)
   // during creation photos are handled by Nova Resource Observer
   if($model->type !== post_type_photo()) return;
   // run only for update request
   FilepondHelper::handleMediaFillUsingCallback(PostMediaTag::photos, true, $request, $model, $attribute, $requestAttribute); // only update
)
->resolveUsing(function($value, $resource, $attribute) use($request)
   return FilepondHelper::handleMediaResolveUsingCallback(PostMediaTag::photos, $value, $resource, $attribute, $request);
),

希望这能解决您的问题。谢谢

【讨论】:

以上是关于没有实际数据库列的表单上的 Laravel Nova 额外“图像”字段的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 在商店和更新上的表单请求验证使用相同的验证

Laravel 表单返回,共享主机上的 500 服务器错误

Laravel Eloquent 搜索表单查询(表单中的多个参数)

Laravel 记录表单请求验证实际错误消息的最简单方法

Laravel - 错误信息没有转化为实际的错误信息,以“验证”开头。

使用 php 和 laravel 显示表单数据