Php Laravel5.4:除了视图、模型和存储库之外,我在哪里可以做逻辑?
TLDR:在Laravel5.4中,如果我不想从模型向数据库发出50k请求,并且想限制视图中的逻辑,那么我在哪里可以执行逻辑 基本上,我的表格如下所示: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| |
-----
|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