第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Laravel 多態(tài)關(guān)系 - 警報(bào)系統(tǒng)

Laravel 多態(tài)關(guān)系 - 警報(bào)系統(tǒng)

PHP
繁花不似錦 2022-06-11 10:30:20
我有 3 個(gè)模型,User、Alert和Category。User和之間的關(guān)系Category是多對(duì)多的。Alert和之間的關(guān)系Category也是多對(duì)多的。AUser應(yīng)該只接收Alert屬于已選擇的相同Category的User。例如,如果將UserTravel和Food作為,Category那么我只想Alert將Travel和Food顯示給User。一旦User查看了Alert,Alert則應(yīng)將該特定 的 標(biāo)記為“已讀” 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();}在當(dāng)前的實(shí)現(xiàn)中,有 3 個(gè)數(shù)據(jù)透視表:alert_category、alert_user和category_user。alert_user表有一個(gè)名為的額外字段read,它基本上確定用戶是否已閱讀警報(bào)。IEalert_user tablealert_iduser_idread (holds 0 or 1)這個(gè)實(shí)現(xiàn)有很多缺陷,我認(rèn)為它根本不起作用,因?yàn)?newUser不會(huì)收到Alert在注冊(cè)之前創(chuàng)建的,如果Alert更改Category,它不會(huì)被更新。當(dāng)然,它可以通過顯式更新每個(gè)表來完成,但我不認(rèn)為這是有效的,也不是架構(gòu)。我正在考慮將整個(gè)事情重構(gòu)為多對(duì)多的多態(tài)關(guān)系。但是,我如何確定是否User已閱讀特定內(nèi)容Alert?我應(yīng)該在哪里放置一個(gè)read字段?你怎么看?我對(duì)任何想法持開放態(tài)度。任何幫助將不勝感激。編輯:總而言之,我想我想做的是,而不是User訂閱Alert,它應(yīng)該訂閱Category. 因此,基本上User將收到所有Alert相同的Category。
查看完整描述

2 回答

?
尚方寶劍之說

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊

如果您希望新注冊(cè)的用戶看到所選類別下的所有以前的警報(bào),基本上就是說登錄用戶應(yīng)該看到這些類別下的所有警報(bào)。


我不認(rèn)為將 aalert與 a聯(lián)系起來user會(huì)給你帶來任何好處。如果有的話,它會(huì)給你增加一層額外的復(fù)雜性。


現(xiàn)在,如果您想跟蹤 which usersread which alert,您可以使用該alert_user表?;旧?,當(dāng) auser讀取一個(gè)alert. created_at將告訴您用戶閱讀的確切時(shí)間alert,因此read也不需要標(biāo)志。


并且,為了顯示警報(bào),您可以查詢,例如,與登錄用戶沒有關(guān)系記錄的警報(bào)。你可以使用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();

如果您只想顯示推文而不排除經(jīng)過身份驗(yàn)證的用戶:


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


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


})->get();


查看完整回答
反對(duì) 回復(fù) 2022-06-11
?
隔江千里

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊

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


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

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

  //do something with that particular alert

 }

}

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


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

//will return alert or null


查看完整回答
反對(duì) 回復(fù) 2022-06-11
  • 2 回答
  • 0 關(guān)注
  • 139 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)