Доступ к функции отношения hasMany через коллекцию - PullRequest
1 голос
/ 27 марта 2020

Я пытаюсь получить уведомления всех пользователей, и в зависимости от того, является ли пользователь покупателем или продавцом (может быть и тем, и другим). Я сделал две функции в своей таблице уведомлений, чтобы отфильтровать друг друга. Моя цель в конечном итоге запустить:

$notifications = Auth::user()->notifications()->getBuyerNotifications();

или

$notifications = Auth::user()->notifications()->getSellerNotifications();

Я столкнулся с проблемой: Call to undefined method Illuminate\Database\Eloquent\Relations\HasMany

Модель пользователя:

public function notifications() {
   return $this->hasMany('App\Notification', 'user_id', 'id');
}

Модель уведомлений:

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

Команда, которую я хочу запустить, чтобы получить уведомления всех пользователей, если они являются покупателем: $notifications = Auth::user()->notifications()->getBuyerNotifications();

Ответы [ 3 ]

0 голосов
/ 27 марта 2020

Auth::user() использует данные сеанса.

Попробуйте это:

optional(User::find(Auth::id())->notifications)->getBuyerNotifications;

или

$userId = 1; // Example id you can just pass the user Id.
User::find($userId)->notifications->getBuyerNotifications;
0 голосов
/ 27 марта 2020

Вы можете добавить два других метода в модель пользователя следующим образом

public function getBuyerNotifications() {
    return $this->hasMany('App\Notification', 'buyer_id', 'id');
}
public function getSellerNotifications() {
    return $this->hasMany('App\Notification', 'seller_id', 'id');
}

И вы можете вызвать его напрямую из пользовательского экземпляра

$user->getBuyerNotifications();
$user->getSellerNotifications();
0 голосов
/ 27 марта 2020

Во-первых, вам не нужно использовать whereNull('deleted_at'), вы можете импортировать черту softDeletes в вашей модели:

use Illuminate\Database\Eloquent\SoftDeletes;
...
class Notification extends Model {
    use SoftDeletes;
    ...
}

Laravel автоматически будет использовать whereNull('deleted_at') в Eloquent-Builder.

Во-вторых, вы не можете использовать метод stati c для Illuminate\Database\Eloquent\Relations\HasMany.

Вместо этого используйте scope метод:

public function scopeBuyerNotifications($query) {
    return $query->whereNotNull('buyer_id');
}
public function scopeSellerNotifications($query) {
    return $query->whereNotNull('seller_id');
}

Таким образом, вы можете найти уведомление как это:

$notifications = Auth::user()->notifications()->sellerNotifications()->get();

$notifications = Auth::user()->notifications()->buyerNotifications()->get();
...