2017-10-18 67 views
0

我試圖顯示用戶登錄時的未讀消息數(如果有)。問題是,當我使用新創建的帳戶登錄時我收到了X條未讀消息的通知,但沒有。消息計數器顯示Laravel中記錄的用戶的消息總數而不是計數

爲了更好地解釋它。如果admin發送消息到user1user1尚未讀取它,當user2登錄時它將通知有1條未讀消息。當user1閱讀它時,通知將消失。

我已經加入這個我ViewComposerServiceProvider開機功能

public function boot() 
{ 

    dd(Auth::user()); <--- return NULL 

    $unviewedCustomersMessagesCount = Message::where('read_state', '0')->where('from_admin', '1')->count(); 
    View::share('unviewedCustomersMessagesCount', $unviewedCustomersMessagesCount); 
} 

然後,我只是表明如果需要,這是我Message模型view.blade

{{ $unviewedCustomersMessagesCount }} 

櫃檯

class Message extends Eloquent 
{ 
    protected $table = 'messages'; 
    protected $primaryKey = 'message_id'; 

    public function user() 
    { 
     return $this->belongsTo('App\User', 'user_id', 'user_id'); 
    } 

    public function markAsRead() 
    { 
     $this->read_state = '1'; 
     $this->save(); 
    } 
} 

And User model

class User extends Eloquent implements AuthenticatableContract, CanResetPasswordContract 
{ 
    use EntrustUserTrait; 
    use Authenticatable, CanResetPassword; 

     [....] 

    public function messages() 
    { 
     return $this->hasMany('App\Message', 'user_id', 'user_id'); 
    } 
} 

有沒有更好的方法來統計用戶的消息?

控制器

class Controller extends BaseController 
{ 
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests; 

    public function __construct() 
    { 
      $unviewedCustomersMessagesCount = Message:: 
      whereRaw('messages.message_id = (select max(message_id) from `messages` m2 where m2.user_id = messages.user_id)') 
       ->where('read_state', '0') 
       ->where('from_admin', '0') 
       ->where('user_id', Auth::user()->user_id) 
       ->count(); 

      View::share('unviewedCustomersMessagesCount',$unviewedCustomersMessagesCount); 

    }    
} 

回答

1

您需要將當前用戶ID傳遞到您的查詢,刪除原始查詢

$currentUserId = Auth::user()->id; 
$unviewedMessagesCount = Message::where('read_state', '0') 
      ->where('from_admin', '0') 
      ->where('user_id',$currentUserId)    
      ->count(); 
1

嘗試this..I認爲在您的情況whereraw聲明犯規需求。

view()->composer('layouts.master', function($view){ 

     $unviewedMessagesCount = 
     Message::where('read_state','=', '0') 
      ->where('from_admin','=', '0')    
      ->count();     
     $view->with('/', $unviewedMessagesCount); 
    }); 
+0

謝謝,但我仍然看到,即使我沒有,我也有消息。 – Peter

+0

你也檢查你的數據庫嗎? –

+0

是的,當某個用戶發出'from_admin'的消息並且讀取狀態爲'0'時 - 所有用戶都會看到未讀消息的通知 – Peter

1

嘗試Messages模型鑄造,加$cast爲:

protected $casts = ["read_state"=>"boolean", "from_admin"=>"integer"]; 

而且在View Composer的嘗試獲得未讀郵件,如:

$messages = \Auth::user()->messages()->where('read_state', false)->where('from_admin', 0)->count(); 

我不知道是否from_adminbooleaninteger,您可能會根據需要更改$casts並在查詢內部也使用truefalse0

+0

它是'在' – Peter

+0

有可能是因爲你不能夠得到'''驗證一些問題: :user()''',正如你所說的那樣,它在問題描述中返回'''nulll'''。修復它也會解決你的問題。 – Peter

+0

)上的空1'的管理和'0'爲得到這個錯誤'調用一個成員函數消息(用戶 – Dev