2017-10-18 4 views
0

Ich versuche, die Anzahl der ungelesenen Nachrichten (wenn vorhanden) anzuzeigen, wenn Benutzer sich anmeldet. Das Problem ist, dass wenn ich mich mit neu erstellten Konto einloggen Ich habe Benachrichtigungen für X ungelesene Nachrichten erhalten, aber keine.Nachrichten Zähler zeigt die Gesamtzahl der Nachrichten anstelle der Anzahl für den angemeldeten Benutzer in Laravel

Um es besser zu erklären. Wenn admin Nachricht an user1 sendet und user1 es noch nicht gelesen wird, wenn user2 sich anmeldet, wird es Benachrichtigung haben, dass 1 ungelesene Nachricht ist. Wenn user1 gelesen wird, wird die Benachrichtigung verschwinden.

Ich habe hinzugefügt, dies zu meiner ViewComposerServiceProvider Boot-Funktion

public function boot() 
{ 

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

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

Und dann zeige ich einfach den Zähler in view.blade

{{ $unviewedCustomersMessagesCount }} 

Wenn brauchen dies mein Message Modell ist

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(); 
    } 
} 

Und User Modell

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

     [....] 

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

Gibt es eine bessere Möglichkeit, die Nachrichten für den Benutzer zu zählen?

-Controller

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); 

    }    
} 

Antwort

1

benötigen Sie den aktuellen Benutzer-ID auf Ihre Frage zu übergeben, entfernen Sie die rohe Abfrage

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

Versuchen this..I zu denken whereraw Aussage braucht nicht in Ihrer Situation.

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

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

Danke, aber ich sehe immer noch, dass ich Nachrichten habe, auch wenn ich es nicht tue. – Peter

+0

überprüfen Sie auch Ihre Datenbank? –

+0

Ja, wenn für einige Benutzer die Nachricht 'from_admin' angezeigt wird und der Lesezustand '0' ist - alle Benutzer sehen eine Benachrichtigung für ungelesene Nachricht – Peter

1

Versuchen in Messages Modellguss, fügen $cast als:

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

Und in Ansicht Komponisten versuchen immer ungelesene Nachrichten wie:

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

Ich bin nicht sicher, ob from_admin ist boolean oder integer, können Sie ändern, wie erforderlich in $casts und auch true oder false oder 0 innerhalb der Abfrage verwenden.

+0

Es ist '1' für admin und' 0' für Benutzer – Peter

+0

Hat diesen Fehler 'Call to a member function messages() auf null in' – Peter

+0

Es könnte ein Problem sein, da Sie '' 'Auth nicht bekommen können: : user() '' ', wie Sie erwähnt haben, dass es' '' nulll''' in der Problembeschreibung zurückgibt. Das Problem zu beheben, wird auch dein Problem lösen. – Dev

Verwandte Themen