Php Laravel5.4:除了视图、模型和存储库之外,我在哪里可以做逻辑?

Php Laravel5.4:除了视图、模型和存储库之外,我在哪里可以做逻辑?,php,laravel,blade,eager-loading,Php,Laravel,Blade,Eager Loading,TLDR:在Laravel5.4中,如果我不想从模型向数据库发出50k请求,并且想限制视图中的逻辑,那么我在哪里可以执行逻辑 基本上,我的表格如下所示: ----- |users| |-id | ----- ------------- |subscriptions| |-id | |-user_id | ------------- ---------------- |participations | |-subscription_id| |

TLDR:在Laravel5.4中,如果我不想从模型向数据库发出50k请求,并且想限制视图中的逻辑,那么我在哪里可以执行逻辑

基本上,我的表格如下所示:

 -----  
|users|  
|-id  |  
 -----  
 -------------
|subscriptions|
|-id          |
|-user_id     |
 -------------
 ----------------
|participations  |
|-subscription_id|
|-activity_id    |
 ----------------
 ---------
|activities|
|-id       |
 ---------
现在的问题是,我有一个视图,看起来像一个每周日历,我们可以显示用户的所有活动,他们有权访问,并根据日期,并指出他们是否参与

@foreach(datesOfCurrentWeek() as $date)
    <div class="title">
        <i class="dropdown icon"></i>
        {{$date->format("l Y-m-d")}}
    </div>

    <div class="content">
        @foreach($users as $user)
            <div class="accordion">
                <div class="title">
                    <i class="dropdown icon"></i>
                    {{ $user->name }} 
                </div>
                <div class="content">
                    @foreach($user->activitiesAt($date) as $activity)
                        @include('calendar.partials.card', ['activity' => $activity, 'participation' => $activity->participation($user)])
                    @endforeach
                </div>
            </div>
        @endforeach
    </div>
@endforeach
然后单击
$activity->participation($user)
,返回用户对此活动的参与情况。
在模型中:

return Activities::where(['group_id' => $this->group->id, 'date_start_at' => $date->format('Y-m-d')])->get();
return $this->participations()->where(['subscription_id' => $user->activeSubscription()->id])->first();
以及用户模型的活动订阅

public function activeSubscription()
{
    // todo: get the active one
    return $this->subscriptions()->first();
}
日历.partial.date
(在这一点上没有什么特别的)

但是,由于查询有一个“dynamic”where子句,我不能用hougeLoading预加载,请求可能会很快过度膨胀。 (4个用户,每个活动3个,我已经有100多个查询)

我认为最优化的方法是加载所有内容,然后在视图中执行逻辑,但这正是我试图避免的。那么,你知道我如何在保持清晰视图的同时进行逻辑分析吗

除此之外:我正在使用存储库,我觉得在存储库之外添加where子句是错误的


谢谢大家!

您将能够使用即时加载,并且必须对代码进行大量更改

我将对您的代码进行一些假设,例如模型名称和关系类型,但您应该了解要点。我还了解到,以下内容不会考虑您正在使用存储库的事实,但您应该能够轻松地对它们进行重构以适应需要

首先,在
用户
模型中(除非您已经这样做),添加以下方法:

/**
 * Activities Relationship
 *
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function activities()
{
    return $this->hasMany(Activities::class, 'group_id', 'group_id');
}

/**
 * Active Subscription Relationship
 *
 * @return mixed
 */
public function activeSubscription()
{
    return $this->hasOne(Subscription::class)
        ->where('active', true); // <-- You would replace this will the actual logic to get the active subscription
}

/**
 * Helper method to get the users activities for the supplied date
 *
 * @param $date
 * @return mixed
 */
public function activitiesForDate($date)
{
    return $this->activities->toBase()
        ->filter(function ($activity) use($date) {
            return $activity->date_start_at->isSameDay($date);
        });
}
然后,您的查询将类似于:

$dates = collect(datesOfCurrentWeek());

$users = User::with(['activeSubscription', 'activities' => function ($query) use($dates) {
    $query->with('participations')->startsBetween($dates->first(), $dates->last());
}])->get();
@foreach(datesOfCurrentWeek() as $date)
    <div class="title">
        <i class="dropdown icon"></i>
        {{ $date->format("l Y-m-d") }}
    </div>

    <div class="content">
        @foreach($users as $user)
            <div class="accordion">
                <div class="title">
                    <i class="dropdown icon"></i>
                    {{ $user->name }}
                </div>
                <div class="content">
                    @foreach($user->activitiesForDate($date) as $activity)
                        @include('calendar.partials.card', ['activity' => $activity, 'participation' => $activity->hasParticipant($user)])
                    @endforeach
                </div>
            </div>
        @endforeach
    </div>
@endforeach
最后,您的刀片文件将如下所示:

$dates = collect(datesOfCurrentWeek());

$users = User::with(['activeSubscription', 'activities' => function ($query) use($dates) {
    $query->with('participations')->startsBetween($dates->first(), $dates->last());
}])->get();
@foreach(datesOfCurrentWeek() as $date)
    <div class="title">
        <i class="dropdown icon"></i>
        {{ $date->format("l Y-m-d") }}
    </div>

    <div class="content">
        @foreach($users as $user)
            <div class="accordion">
                <div class="title">
                    <i class="dropdown icon"></i>
                    {{ $user->name }}
                </div>
                <div class="content">
                    @foreach($user->activitiesForDate($date) as $activity)
                        @include('calendar.partials.card', ['activity' => $activity, 'participation' => $activity->hasParticipant($user)])
                    @endforeach
                </div>
            </div>
        @endforeach
    </div>
@endforeach
@foreach(datesOfCurrentWeek()作为$date)
{{$date->格式(“l Y-m-d”)}
@foreach($users作为$user)
{{$user->name}
@foreach($user->activitiesForDate($date)作为$activity)
@包括('calendar.partials.card',['activity'=>$activity,'participation'=>$activity->hasParticipant($user)])
@endforeach
@endforeach
@endforeach
以上应该考虑到您需要加载的所有内容


希望这有帮助

您还可以显示
calendar.partials.card
文件吗?我添加了此文件,但在开发的这一点上,其中没有什么真正重要的内容。您还可以显示您的
$user
模型中的
activeSubscription()
方法吗?请完成。但是我还没有为这个做逻辑分析。非常感谢!是的,这确实对我有帮助
@foreach(datesOfCurrentWeek() as $date)
    <div class="title">
        <i class="dropdown icon"></i>
        {{ $date->format("l Y-m-d") }}
    </div>

    <div class="content">
        @foreach($users as $user)
            <div class="accordion">
                <div class="title">
                    <i class="dropdown icon"></i>
                    {{ $user->name }}
                </div>
                <div class="content">
                    @foreach($user->activitiesForDate($date) as $activity)
                        @include('calendar.partials.card', ['activity' => $activity, 'participation' => $activity->hasParticipant($user)])
                    @endforeach
                </div>
            </div>
        @endforeach
    </div>
@endforeach