Laravel - 添加来自 Eloquent 模型 belongsToMany 关系的额外 where 约束

Laravel - Add additional where constraints from Eloquent Model belongsToMany relationship

我是 Laravel(使用 v7)的新手,所以如果我做错了,我深表歉意。 我为我的用户设置了自定义订阅。

我有我的用户table

id first_name last_name
1 John Doe
2 Jane Doe

我有我的订阅table

id name
1 Basic
2 Bronze
3 Silver
4 ​ Gold
5 ​ Platinum

还有一个 subscription_user 支点 table

id user_id subscription_id created_at expired_at
1 1 1 2021-02-01 23:22:12 2021-03-21 08:22:12
2 1 5 2021-03-21 08:22:12 2021-04-04 09:03:21
2 1 3 2021-04-04 09:03:21
2 2 1 2021-01-01 01:00:00 2021-01-05 05:30:00
2 2 2 2021-01-05 05:30:00 2021-01-06 08:34:10

因此,根据以上条目,John Doe 订阅了基本订阅,然后升级到白金,最后降级到白银。这是他当前的订阅。

我有以下方法(在 User.php 内)首先获取用户订阅列表

public function subscriptions()
{
  return $this->belongsToMany('App\Subscription')
    ->orderby('pivot_created_at', 'desc')
    ->withPivot('created_at', 'expired_at')
    ->withTimestamps();
}

然后获取当前订阅

public function subscription()
{
  return $this->subscriptions->first();
}

但是,在某些情况下,用户的所有订阅都已过期,因此他们没有当前订阅。即在上述记录中 Jane Doe 订阅了 2 个计划但都已过期。

如果我在 Jane Doe 上调用 $user->subscription(),它仍然是 returns 最新的过期条目。 我已尝试将 where() 子句添加到我的 subscription 方法中,但它没有效果:

public function subscription()
{
  return $this->subscriptions->where('expired_at', NULL)->first();
}

有没有更好的方法来实现我想要实现的目标?我需要一种方法来获取所有用户订阅,无论他们是活跃的还是过期的。 (我有 - 这是最好的方法吗?)

但随后还要获取当前订阅,它应该始终没有 expired_at。 看来我不能在 mt subscription 方法中添加任何进一步的条件。

您需要使用 subscriptions() 而不是集合 subscriptions

的订阅方法的查询生成器
public function subscription()
{
  return $this->subscriptions()->whereNull('expired_at')->first();
}

调用$this->subscriptions等同于$this->subscriptions = $this->subscriptions()->get()。其中 $this->subscriptions return 是一个集合。

$this->subscriptions(),使用方法,return 查询生成器。

PS: 它没有触发错误调用 first() 因为 Collection 也有一个名为 first() 的方法。