为我的网站开发概念模型的问题

时间:2017-09-09 11:40:13

标签: laravel-5 packages business-logic php-7.1 web-project

我想讨论一个与代码无关的问题。相反,这是概念或数据模型本身的问题。

我正在使用Laravel构建一个商业目录网站。

我制作了一个packages表,为后端实现了包CRUD功能,并实现了一个包列表,前端有注册按钮。按下注册按钮时,包ID将传递到注册路径。

我已将package_id添加为users表的外键。但我现在的问题是,如果用户直接进入注册路由,则没有包ID。因此,我想签署一个免费软件包。

由于动态包,我无法使用LIKE查询,如果删除并再次添加免费包以及如果删除免费包,如何处理异常,也可以更改名称和ID。

请帮助我提供更好的方法。

2 个答案:

答案 0 :(得分:4)

正如您所说使用文本搜索来匹配记录是一种不好的做法,有很多方法可以正确解决问题:

  1. 添加布尔字段is_free; 如果你想使它成为唯一的,使它可以为空,唯一,并且默认为null但是请记住,对于非自由的值,该值应为null,对于唯一的自由包,该值应为true,否则唯一约束将失败(该字段支持多个空项但只有一个是真还是假)
  2. 获取价格等于零的第一个包
  3. 为package_groups创建一个外键并创建一个“free”组,如果你不需要将包分成组,那就有点过于复杂了
  4. 我们假设您的包裹注册路线是

    /sign-up/{package_id?}
    

    注意“?”在package_id之后,它告诉参数可能会丢失。

    如果我理解正确的逻辑是:

    • 如果指定package_id为具有该ID
    • 的包的登录
    • 如果package_id为空注册免费包

    路线应该是这样的:

    Route::get('/sing-up/{package_id?}', 'PackageController@signUp');
    

    控制器应该做这样的事情:

    PackageController extends Controller{
    //....
        public signUp($id=null){
           $package=($id==null)?Package::free()->first():Package::findOrFail();
           //If $package is null there are currently no active free packages
           ///sign-up logic here...
        }
    
    }
    

    假设Package :: free()是过滤免费包的范围,例如:

    Package extends model{
    //....
        function scopeFree($query){
            return $query->where('is_free',true); //for option 1. 
        }
    }
    

答案 1 :(得分:2)

当您从注册路线发布用户数据时,请检查包ID是否存在,然后使用,否则获取您的免费包的包ID,然后使用它来使用包ID进行签名。

这就像是说用户无法在没有包ID的情况下注册,但是当他们直接注册时我会在哪里获得包ID。当你回发时,你不会获得包ID或获得null或0,无论你在回发或ajax注册表单中有什么。使用它来检查它是否是一个有效的包ID,然后如果它不是获得你的免费包的ID(你可以使用任何sql只从包表获取它,一旦你有免费包的ID,然后开始注册用户和将该ID插入数据库,它不会抱怨)。通过这种方式,您可以在没有传递包ID或有人尝试发送错误的包ID的情况下使用。