如何在控制器上使用一对多关系。 Laravel LaraPlans

时间:2017-09-13 00:10:54

标签: php laravel laravel-5.4

我正在使用此软件包: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帐户功能中看到的那样,我访问该主题的方式就是它的名称。

我如何知道Authtenticated用户的活动嫌疑人?我想通过DB上的plan_suscriptions表上的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

enter image description here

正如您所看到的,没有任何属性可以获取信息,因此我不确定我是否正确使用此关系。

1 个答案:

答案 0 :(得分:1)

这是Laravel的魔力。

通过调用Auth :: user()获取用户模型,因此您已经拥有了所需的相关模型。经过身份验证的用户。

现在在Model-Definition中你可能有一个返回相关模型的方法订阅。 (您可能为'Pro'参数添加了一些逻辑。)

这里的Laravel是在考虑到配置约定的情况下开发的,并且知道表中实际要查找的行。所以你需要的是每个表中的'id',并且由于关系是持有订阅的表中的'user_id'。有一种方法可以用不同的方式定义。以下是文档:https://laravel.com/docs/5.4/eloquent-relationships

所以你从相关用户那里得到了计划,我在这里看不到任何不好的东西。

===

您使用$ user-&gt;订阅但请改为->subscriptions()(注意复数's')。 使用循环(或 - &gt; first()),因为您获得了计划而不是一个计划

现在你总是传递'Pro',但经过身份验证的用户现在可能订阅了Pro-Plan,因此返回null。订阅返回hasMany关系。从那里/没有尝试/你可以循环结果并获得计划的名称或任何你需要的。注意:它是一个hasMany,尽管用户可能只订阅了一个订阅。所以你需要循环或得到第一个结果。