2017-09-09 60 views
2

我想討論一個與代碼無關的問題。相反,這是概念或數據模型本身的問題。爲我的網站開發概念模型問題

我正在使用Laravel建立企業目錄網站。

我做了一個packages表,爲後端實現了包的CRUD功能,並實現了一個包列表和前端的註冊按鈕。當按下注冊按鈕時,包ID將被傳遞到註冊路線。

我已將package_id添加爲users表的外鍵。但是我現在的問題是,如果用戶直接進入註冊路線,那麼沒有包ID。因此,我想簽署一個免費套餐。

由於動態包,我不能使用LIKE查詢,並且可以更改名稱和ID以及免費包被刪除並再次添加以及如何在刪除免費包時處理異常。

請幫助我更好的方法。

+0

你是如何處理的其他包的缺失? – fubar

回答

2

當您從註冊路徑發佈用戶數據時,請檢查包ID是否存在,然後正確使用,否則將獲取您的免費包的包ID,然後使用它來用包ID對其進行註冊。

這就像說用戶無法在沒有包ID的情況下注冊,但是在註冊時直接獲取包ID。當你回發你不會得到包ID或無論你在回發或ajax註冊形式獲得null或0。用它來檢查它是否有一個有效的包ID,如果沒有,那麼如果它沒有獲得你的免費包的ID(你可以使用任何SQL從包表中獲取它,一旦你有了免費包的ID,然後開始註冊用戶和將該ID插入數據庫,它不會抱怨)。通過這種方式,您可以在兩種情況下都無法傳遞包ID或有人試圖發送錯誤的包ID。

4

至於你說的使用文本搜索匹配的記錄是一個不好的做法,也有很多的方法,正確處理這個問題:

  1. 添加一個布爾字段is_free; 如果你想使它唯一使其可爲空,唯一和默認爲空,但記住對於唯一的免費軟件包,值應該爲非空或真,否則唯一約束將失敗(該字段支持多個空項目一個是true或false)
  2. 獲取價格等於零的第一個包
  3. 爲package_groups創建一個外鍵並創建一個「空閒」組,如果您不需要將包分成組

讓我們假設你的軟件包的註冊途徑是

/sign-up/{package_id?} 

注意「?」在package_id之後,它告訴參數可能會丟失。

邏輯如果我理解它正確是:

  • 如果的package_id指定登錄爲包與ID
  • 如果的package_id是空註冊一個免費包

路線應該是這樣的:

Route::get('/sing-up/{package_id?}', '[email protected]'); 

而且控制器應做這樣的事情:

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 extends model{ 
//.... 
    function scopeFree($query){ 
     return $query->where('is_free',true); //for option 1. 
    } 
} 
+0

wao!這是定義問題的好辦法。我瞭解結構。謝謝#Plokko –