我想讨论一个与代码无关的问题。相反,这是概念或数据模型本身的问题。
我正在使用Laravel构建一个商业目录网站。
我制作了一个packages
表,为后端实现了包CRUD功能,并实现了一个包列表,前端有注册按钮。按下注册按钮时,包ID将传递到注册路径。
我已将package_id
添加为users
表的外键。但我现在的问题是,如果用户直接进入注册路由,则没有包ID。因此,我想签署一个免费软件包。
由于动态包,我无法使用LIKE
查询,如果删除并再次添加免费包以及如果删除免费包,如何处理异常,也可以更改名称和ID。
请帮助我提供更好的方法。
答案 0 :(得分:4)
正如您所说使用文本搜索来匹配记录是一种不好的做法,有很多方法可以正确解决问题:
is_free
;
如果你想使它成为唯一的,使它可以为空,唯一,并且默认为null但是请记住,对于非自由的值,该值应为null,对于唯一的自由包,该值应为true,否则唯一约束将失败(该字段支持多个空项但只有一个是真还是假)我们假设您的包裹注册路线是
/sign-up/{package_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的情况下使用。