亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Laravel 多態關系 - 警報系統

Laravel 多態關系 - 警報系統

PHP
繁花不似錦 2022-06-11 10:30:20
我有 3 個模型,User、Alert和Category。User和之間的關系Category是多對多的。Alert和之間的關系Category也是多對多的。AUser應該只接收Alert屬于已選擇的相同Category的User。例如,如果將UserTravel和Food作為,Category那么我只想Alert將Travel和Food顯示給User。一旦User查看了Alert,Alert則應將該特定 的 標記為“已讀” User。目前我正在這樣做:Category.phppublic function alerts(){    return $this->belongsToMany('App\Alert')->withTimestamps();}public function users(){    return $this->belongsToMany('App\User')->withTimestamps();}User.phppublic function alerts(){   return $this->belongsToMany('App\Category')->withTimestamps();}public function categories(){   return $this->belongsToMany('App\Alert')->withTimestamps()->withPivot('read');}Alert.phppublic function users(){    return $this->belongsToMany('App\User')->withTimestamps()->withPivot('read');}public function categories(){    return $this->belongsToMany('App\Category')->withTimestamps();}在當前的實現中,有 3 個數據透視表:alert_category、alert_user和category_user。alert_user表有一個名為的額外字段read,它基本上確定用戶是否已閱讀警報。IEalert_user tablealert_iduser_idread (holds 0 or 1)這個實現有很多缺陷,我認為它根本不起作用,因為 newUser不會收到Alert在注冊之前創建的,如果Alert更改Category,它不會被更新。當然,它可以通過顯式更新每個表來完成,但我不認為這是有效的,也不是架構。我正在考慮將整個事情重構為多對多的多態關系。但是,我如何確定是否User已閱讀特定內容Alert?我應該在哪里放置一個read字段?你怎么看?我對任何想法持開放態度。任何幫助將不勝感激。編輯:總而言之,我想我想做的是,而不是User訂閱Alert,它應該訂閱Category. 因此,基本上User將收到所有Alert相同的Category。
查看完整描述

2 回答

?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

如果您希望新注冊的用戶看到所選類別下的所有以前的警報,基本上就是說登錄用戶應該看到這些類別下的所有警報。


我不認為將 aalert與 a聯系起來user會給你帶來任何好處。如果有的話,它會給你增加一層額外的復雜性。


現在,如果您想跟蹤 which usersread which alert,您可以使用該alert_user表。基本上,當 auser讀取一個alert. created_at將告訴您用戶閱讀的確切時間alert,因此read也不需要標志。


并且,為了顯示警報,您可以查詢,例如,與登錄用戶沒有關系記錄的警報。你可以使用whereDoesntHave. 例如,像這樣:


Alert::whereHas('categories', function($query) use ($category_id_array){


  $query->whereIn('category_id', $category_id_array);


})->whereDoesntHave('users', function($query) use ($user_id){


  $query->where('user_id', $user_id); //user_id is auth()->user()->id


})->get();

如果您只想顯示推文而不排除經過身份驗證的用戶:


Alert::whereHas('categories', function($query) use ($category_id_array){


  $query->whereIn('category_id', $category_id_array);


})->get();


查看完整回答
反對 回復 2022-06-11
?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

如果您希望選擇一個用戶,然后確定他是否有任何未讀警報,那么您可以這樣做:


foreach($user->alerts as $alert){

 if($alert->read == 1){

  //do something with that particular alert

 }

}

如果要確定是否已讀取特定警報,可以像這樣搜索它:


Alert::where('id', '=', $alert_id)->where('read', '=', 1)->first(); 

//will return alert or null


查看完整回答
反對 回復 2022-06-11
  • 2 回答
  • 0 關注
  • 141 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號