如何在控制器上使用一对多关系。 Laravel 劳拉计划
How to use one-to-many relationship on controller. Laravel LaraPlans
我正在使用这个包:https://github.com/gerardojbaez/laraplans 文档有点混乱。
用户的信息可以从订阅计划中获取,但反之亦然,所以我在尝试使用 2 种(或更多)订阅计划时遇到了问题。
我的 HomeController 上有这个:
public function account()
{
$user = Auth::user();
$plan = $user->subscription('Pro');
return view('auth.profile')->with('user', $user)->with('plan', $plan);
}
这是我的看法
<li class="list-group-item">
{{ $plan->ends_at }}
</li>
<li class="list-group-item">
{{ $plan->user->name }}
</li>
从这里您可以了解模型的连接方式,现在,正如您在 HomeController 帐户功能上看到的那样,我访问订阅的方式是通过其名称。
我如何知道已验证用户的有效订阅?我在想通过数据库上 plan_suscriptions table 上的 user_id,但是在尝试访问它时我总是得到 NULL。
我认为我的逻辑方法有问题。
在软件包附带的 PlanSubscriber Trait 中,有一个功能似乎可以解决我的问题:
/**
* Get user plan subscription.
*
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function subscriptions()
{
return $this->hasMany(config('laraplans.models.plan_subscription'));
}
但是当使用 dd();在我的控制器上使用该功能时,我得到以下信息:
函数:
public function account()
{
$user = Auth::user();
$plan = $user->subscriptions();
dd($plan);
}
DD:
如您所见,没有可从中获取信息的属性,所以我不太确定我是否正确使用了这种关系。
这就是 Laravel 的魔力。
您可以通过调用 Auth::user() 获得用户模型,因此您已经拥有了您正在寻找的相关模型。经过身份验证的用户。
现在在模型定义中,您可能有一个方法订阅,returns 相关模型。 (您可能为 'Pro' 参数添加了一些逻辑)。
这里的 Laravel 是在考虑到配置约定的情况下开发的,并且知道 table 中实际要查找的行。因此,您需要的是每个 table 中的 'id',并且由于关系 table 中的 'user_id' 持有订阅。有一种方法可以以不同的方式定义它。这是文档:https://laravel.com/docs/5.4/eloquent-relationships
所以你从相关用户那里得到了计划,我看这里没有什么不好的。
===
你使用了 $user->subscription 但使用了 ->subscriptions()
(注意复数 's')。 使用循环(或 ->first()),因为您得到的是计划而不是一个计划
现在您总是传递 'Pro',但经过身份验证的用户现在可能订阅了 Pro-Plan,因此 returns 为空。订阅 returns hasMany 关系。从那里/未尝试/您可以遍历结果并获取计划的名称或任何您需要的名称。注意:它是一个 hasMany,尽管用户可能只订阅了一个订阅。所以你需要循环或得到第一个结果。
我正在使用这个包:https://github.com/gerardojbaez/laraplans 文档有点混乱。
用户的信息可以从订阅计划中获取,但反之亦然,所以我在尝试使用 2 种(或更多)订阅计划时遇到了问题。
我的 HomeController 上有这个:
public function account()
{
$user = Auth::user();
$plan = $user->subscription('Pro');
return view('auth.profile')->with('user', $user)->with('plan', $plan);
}
这是我的看法
<li class="list-group-item">
{{ $plan->ends_at }}
</li>
<li class="list-group-item">
{{ $plan->user->name }}
</li>
从这里您可以了解模型的连接方式,现在,正如您在 HomeController 帐户功能上看到的那样,我访问订阅的方式是通过其名称。
我如何知道已验证用户的有效订阅?我在想通过数据库上 plan_suscriptions table 上的 user_id,但是在尝试访问它时我总是得到 NULL。
我认为我的逻辑方法有问题。
在软件包附带的 PlanSubscriber Trait 中,有一个功能似乎可以解决我的问题:
/**
* Get user plan subscription.
*
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function subscriptions()
{
return $this->hasMany(config('laraplans.models.plan_subscription'));
}
但是当使用 dd();在我的控制器上使用该功能时,我得到以下信息:
函数:
public function account()
{
$user = Auth::user();
$plan = $user->subscriptions();
dd($plan);
}
DD:
如您所见,没有可从中获取信息的属性,所以我不太确定我是否正确使用了这种关系。
这就是 Laravel 的魔力。
您可以通过调用 Auth::user() 获得用户模型,因此您已经拥有了您正在寻找的相关模型。经过身份验证的用户。
现在在模型定义中,您可能有一个方法订阅,returns 相关模型。 (您可能为 'Pro' 参数添加了一些逻辑)。
这里的Laravel 是在考虑到配置约定的情况下开发的,并且知道 table 中实际要查找的行。因此,您需要的是每个 table 中的 'id',并且由于关系 table 中的 'user_id' 持有订阅。有一种方法可以以不同的方式定义它。这是文档:https://laravel.com/docs/5.4/eloquent-relationships
所以你从相关用户那里得到了计划,我看这里没有什么不好的。
===
你使用了 $user->subscription 但使用了 ->subscriptions()
(注意复数 's')。 使用循环(或 ->first()),因为您得到的是计划而不是一个计划
现在您总是传递 'Pro',但经过身份验证的用户现在可能订阅了 Pro-Plan,因此 returns 为空。订阅 returns hasMany 关系。从那里/未尝试/您可以遍历结果并获取计划的名称或任何您需要的名称。注意:它是一个 hasMany,尽管用户可能只订阅了一个订阅。所以你需要循环或得到第一个结果。