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()
的方法。
我是 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()
的方法。