没有实际数据库列的表单上的 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 Eloquent 搜索表单查询(表单中的多个参数)