保存到DB之前的Laravel预览

时间:2016-11-20 07:22:49

标签: php mysql database laravel database-design

我需要你就下一个问题的最佳做法提出建议:

我的管理面板中有一个(非常复杂的)表单,它将图像,常规字段保存到主模型中,并为主模型保存了很多关系。

现在我想添加一个“保存前预览”功能,所以管理员可以在将更改保存到数据库之前预览更改,问题是我实际上无法保存模型或它与数据库的关系,因为然后用户将在发布之前看到更新的数据。 我也无法取消发布帖子或任何关系,因为用户无法访问帖子。

更新

重要的是要知道解决方案必须是通用的,因为我不能总是知道预览页面使用的模型和对象是什么。

提前致谢!

1 个答案:

答案 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);
            }
        }
    }
}

如果您不希望在预览时隐藏带有更新的模型,您可以在草稿模式下生成每个模型的副本,以便旧模型保持不变。如果用户决定放弃更改,您可以删除重复的模型,如果他们想要继续并保存它们,它可能会覆盖旧的模型。