【问题标题】:What is the alternative of fetching multiple queries in Laravel?在 Laravel 中获取多个查询的替代方法是什么?
【发布时间】: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(),因为groupby arg 是Callable\String

标签: php laravel eloquent


【解决方案1】:

感谢@Devon 的评论,我已经克服了集合的问题,我对 Collection 的 groupBy 函数有一点问题,它不能采用列数组,因为我为集合创建了另一个列,它是两个目标列,如下所示。

$allClass->map(function ($classroom) {
        $classroom['sectgrade'] = $classroom['classgrade'].".".$classroom['classsection'];
        return $classroom;
    });

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 2019-05-05
    • 2021-12-07
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 2021-10-17
    • 2014-06-06
    • 2017-11-01
    相关资源
    最近更新 更多