php - 保存到数据库之前的 Laravel 预览

标签 php mysql database laravel database-design

我需要您关于解决下一个问题的最佳实践的建议:

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

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

更新:

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

提前致谢!

最佳答案

如果您希望能够浏览已生效的更改的网站,那么您必须以某种方式将帖子及其相关模型识别为处于某种“草稿”模式,该模式仅可见特定用户。

您可以为 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);
            }
        }
    }
}

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

关于php - 保存到数据库之前的 Laravel 预览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40701642/

相关文章:

database - Grails 2.5.0-重置数据库以使用测试数据

php 使用表单重定向

php - 如何在mysql中更改没有秒的时间戳格式

mysql - 如何使用shell脚本从数据库中的同一变量中获取带空格的数据

SQL Server 数据库保护免受聪明的管理员?

mysql - 如何重建/重新填充 mysql.db 表?

php - 保护 public_html 中的文件夹

php - 查询多个表行的重复记录

mysql - 如何解决这个 MySQL 查询?

c# - 列表框中的 MySQL 数组