【发布时间】:2017-09-11 14:35:37
【问题描述】:
我实际上对 Eloquent 及其工作原理有点困惑。我只是想知道我的方式对于Eloquent ORM 来说不是一个坏习惯或一种开销。
这是我的Classroom 模型的一部分
static function classgradeList(){
return Classroom::select('classgrade')
->groupBy('classgrade')
->orderBy('classgrade')
->get();
}
static function classsectionList(){
return Classroom::select('classgrade','classsection')
->groupBy('classgrade','classsection')
->orderBy('classsection')
->get();
}
static function classnameList(){
return Classroom::select('classgrade','classsection','classname')
->orderBy('classname')
->get();
}
这些功能背后的原因是为同一视图上的 3 个单独区域创建列表。然后我在同一个视图中像下面这样调用它们:
<ul id="classsections" class="dropdown-menu">
@foreach(App\Classroom::classsectionList() as $csect)
<li onclick="csselect(this)" data-cg="{{$csect->classgrade}}" data-cs="{{$csect->classsection}}" class="classsection">
<a>{{$csect->classsection}}</a>
</li>
@endforeach
</ul>
<ul id="classgrades" class="dropdown-menu">
@foreach(App\Classroom::classgradeList() as $cgrade)
<li onclick="cgselect(this);" data-cg="{{$cgrade->classgrade}}" >
<a>{{$cgrade->classgrade}}</a>
</li>
@endforeach
</ul>
<ul id="classnames" class="dropdown-menu">
@foreach(App\Classroom::classnameList() as $item)
<li onclick="cnselect(this)" data-cg="{{$item->classgrade}}" data-cs="{{$item->classsection}}" data-cn="{{$item->classname}}" class="classname">
<a>{{$item->classname}}</a>
</li>
@endforeach
</ul>
我认为这段代码会有一些开销,我想以更好的方式实现它,比如一次获取所有东西并在php 范围内对其进行查询,并最终通过类似Builder laravel 的本机类。
【问题讨论】:
-
您可以在模型中使用查询范围,而不是使用静态函数。如果您有很多不同的方式对项目进行分组,可能没有比运行三个查询更好的解决方案,但如果项目数量有限,您可以尝试使用 Laravel 的收集方法对它们进行分组。所有这些都记录在 laravel.com/docs 上。
-
感谢您的查询范围,好的,那我现在就走查询方式。
-
@Devon 实际上我也测试了集合,但是不可能将数组传递给集合的
groupBy(),因为groupbyarg 是Callable\String