我需要你就下一个问题的最佳做法提出建议:
我的管理面板中有一个(非常复杂的)表单,它将图像,常规字段保存到主模型中,并为主模型保存了很多关系。
现在我想添加一个“保存前预览”功能,所以管理员可以在将更改保存到数据库之前预览更改,问题是我实际上无法保存模型或它与数据库的关系,因为然后用户将在发布之前看到更新的数据。 我也无法取消发布帖子或任何关系,因为用户无法访问帖子。
更新
重要的是要知道解决方案必须是通用的,因为我不能总是知道预览页面使用的模型和对象是什么。
提前致谢!
答案 0 :(得分:1)
如果您希望能够使用有效的更改来浏览网站,那么您必须以某种方式识别帖子及其相关模型,使其成为某种"草稿&# 34;模式,仅对特定用户可见。
您可以为eloquent设置查询范围,例如可以按特定列/值自动过滤任何模型的查询:
https://laravel.com/docs/5.3/eloquent#query-scopes
我创建了一个查询范围,该范围执行身份验证并添加where子句以在用户未登录时过滤结果(您也可以选择在此处检查特定角色):
class PublicScope implements ScopeInterface {
public function apply( Builder $builder )
{
if( !Auth::check() ) {
$builder->where(function( $query ) {
$query->where('is_draft', '!=', 1);
});
}
}
public function remove( Builder $builder )
{
$query = $builder->getQuery();
foreach((array)$query->wheres as $key => $where) {
if($where['column'] == 'is_draft') {
unset($query->wheres[$key]);
$query->wheres = array_values($query->wheres);
}
}
}
}
如果您不希望在预览时隐藏带有更新的模型,您可以在草稿模式下生成每个模型的副本,以便旧模型保持不变。如果用户决定放弃更改,您可以删除重复的模型,如果他们想要继续并保存它们,它可能会覆盖旧的模型。