如何在控制器上使用一对多关系。 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,尽管用户可能只订阅了一个订阅。所以你需要循环或得到第一个结果。