1
votes

Accéder à une fonction de relation hasMany via Collection

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


7 commentaires

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


3 Réponses :


0
votes

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;
    ...
}


1 commentaires

Travaux! Merci



0
votes

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;


0 commentaires

0
votes

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 >


0 commentaires