2017-09-10 5 views
1

私は実際にEloquentとその動作について少し混乱しています。私はちょうど私の方法は、Eloquent ORMの悪い習慣やオーバーヘッドではない方法を知りたいです。 これは私のClassroomモデルLaravelで複数のクエリをフェッチする方法はありますか?

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範囲でそれにクエリを実行したいです最終的にはlaravelのネイティブクラスBuilderのようになります。

+0

静的関数を使用する代わりに、モデルでクエリスコープを使用できます。アイテムをグループ化する方法が異なる場合は、3つのクエリを実行するよりも優れた解決策はありませんが、アイテム数が限られている場合は、代わりにLaravelのコレクションメソッドを使用してグループ化できます。これらはすべてlaravel.com/docsに記載されています。 – Devon

+0

クエリスコープをありがとう、ありがとう、私は今のところ質問の道を行く。 – no0ob

+0

@Devonは実際にコレクションをテストしましたが、Collectionの 'groupBy()'に配列を渡すことは不可能です。 'groupby' argは' Callable \ String'です – no0ob

答えて

1

@ Devonのコメントのおかげで、私はコレクションの問題を克服しました。私は、コレクションのgroupBy関数に少し問題がありました。以下のような2つのターゲット列の

$allClass->map(function ($classroom) { 
     $classroom['sectgrade'] = $classroom['classgrade'].".".$classroom['classsection']; 
     return $classroom; 
    }); 
関連する問題