J'essaie de recevoir toutes les notifications des utilisateurs, et selon que l'utilisateur est un acheteur ou un vendeur (peut être les deux). J'ai créé deux fonctions dans ma table de notifications pour se filtrer. Mon objectif est finalement d'exécuter:
public function user() { return $this->belongsTo('App\User', 'id', 'user_id'); } public static function getBuyerNotifications() { return self::whereNotNull('buyer_id') ->whereNull('deleted_at') ->get(); } public static function getSellerNotifications() { return $this->whereNotNull('seller_id') ->whereNull('deleted_at') ->get(); }
ou
public function notifications() { return $this->hasMany('App\Notification', 'user_id', 'id'); }
Je rencontre un problème: Appel à la méthode non définie Illuminate \ Database \ Eloquent \ Relations \ HasMany
Modèle utilisateur:
$notifications = Auth::user()->notifications()->getSellerNotifications();
Modèle de notifications:
$notifications = Auth::user()->notifications()->getBuyerNotifications();
La commande que je veux exécuter pour obtenir toutes les notifications des utilisateurs s'ils sont un acheteur: $ notifications = Auth :: user () -> notifications () -> getBuyerNotifications ();
3 Réponses :
Premièrement, vous n'avez pas besoin d'utiliser whereNull ('deleted_at')
, vous pouvez importer le softDeletes Trait dans votre modèle:
$notifications = Auth::user()->notifications()->sellerNotifications()->get(); $notifications = Auth::user()->notifications()->buyerNotifications()->get();
Laravel utilisera automatiquement whereNull ('deleted_at')
sur Eloquent -Builder.
Deuxièmement, vous ne pouvez pas utiliser de méthode statique sur Illuminate\Database\Eloquent\Relations\HasMany
.
Utilisez scope à la place:
public function scopeBuyerNotifications($query) { return $query->whereNotNull('buyer_id'); } public function scopeSellerNotifications($query) { return $query->whereNotNull('seller_id'); }
Vous pouvez donc trouver la notification comme celle-ci:
use Illuminate\Database\Eloquent\SoftDeletes; ... class Notification extends Model { use SoftDeletes; ... }
Travaux! Merci
Auth :: user ()
utilise les données de session.
Essayez ceci:
$userId = 1; // Example id you can just pass the user Id. User::find($userId)->notifications->getBuyerNotifications;
ou
optional(User::find(Auth::id())->notifications)->getBuyerNotifications;
Vous pouvez ajouter deux autres méthodes dans le modèle utilisateur comme suit
$user->getBuyerNotifications(); $user->getSellerNotifications();
Et vous pouvez l'appeler directement depuis l'instance utilisateur
public function getBuyerNotifications() { return $this->hasMany('App\Notification', 'buyer_id', 'id'); } public function getSellerNotifications() { return $this->hasMany('App\Notification', 'seller_id', 'id'); }
p >
Pourquoi ces méthodes statiques?
@jeremykenedy testait quelque chose - pas besoin que ce soit statique
Curieux, l'erreur se produit-elle lorsque vous n'avez que
$ notifications = Auth :: user () -> notifications
?@jeremykenedy Aucune erreur. Renvoie juste une collection de notifications
@jeremykenedy maintenant je pourrais faire des notifications () -> whereNotNull ('Buyer_id') etc. en une seule ligne, mais l'avoir dans une fonction serait idéal pour que tout le monde puisse l'appeler
Avez-vous l'ID utilisateur disponible?
@jeremykenedy Oui, user_id est défini et les notifications qu'il renvoie sont pour l'utilisateur actuel