2017-05-20 14 views
0

Iはコントローラ方法におけるこれらの2つのクエリがありますどのように私はこれら2つの同様のクエリを簡素化するのですか?

$tools=Tool::where('tool_date','>',$now)->orderBy('tool_date')->get()->take(3); 

    $keys=Tool::select('name as title','tool_date as start')->get()->toJson(); 

    return view('index')->with(['tools'=>$tools,'keys'=>$keys,'now'=>$now]); 

最初は次のようにブレードに使用される:

<script> 
    eventSources: [ 
       { 
        events: 
          {!! $keys !!}, 

         color: 'black',  
         textColor: 'red' 
       } 
      ] 
</script> 
:第二のようにJavaScriptで使用され、一方

@foreach($tools as $tool) 
{{$tool->name}} 
... 
@endforeach 

これらの2つのクエリを簡略化して1つにまとめるにはどうすればよいですか?

+0

2つのクエリが似ておらず、2つの異なるデータセットを保持しています。便宜上、両方のデータを保持してビューに渡してそれに応じて使用する単一のコレクションまたは配列を作成することができます。それには本当のメリットはありません。また、 'get()'の前に 'take(3)'を使用する必要があります。そうでなければ、dbからすべての結果を取り出してから、3つのアイテムをd結果のコレクションから取り出します。 – Sandeesh

+0

@Sandeesh私は2番目のコレクションにコレクションが必要ですが、最初のコレクションの3つしか取ることはできません。だから、もし単純化されたバージョンがあれば、私はこのtake(3)もあることを示しているだけです。 –

+0

' - > get() - > take(3);'生成されたクエリは条件に一致するすべての行をフェッチし、フェッチ後にlaravelは結果に対して3行を取ります。これは不必要なリソースの無駄です。だから、あなたは ' - > take(3) - > get();'を実行し、データベースから直接3行しか取り出しません。 – Sandeesh

答えて

1

PHP:ブレードで

$tools=Tool::select('name as title','tool_date as start')->where('tool_date','>',$now)->orderBy('tool_date')->get(); 

return view('index')->with(['tools'=>$tools]); 

最初の使用:

@foreach($tools->take(3) as $tool 
{{$tool->title}} 
... 
@endforeach 

第2用途:

つのクエリ厥10
<script> 
eventSources: [ 
      { 
       events: 
         {!! $tools->toJson() !!}, 

        color: 'black',  
        textColor: 'red' 
      } 
     ] 

、およびコレクションの管理。

+0

私は2番目にこれをスキップする必要があります: '(tool_date'、 '>'、$ now) 'を追加し、' $ tools-> where( 'tool_date'、 '>'、$ now) (3) 'を使用します。そして、これは再び単純化されていますか? –

+0

try: '$ tools-> take(3) - > toJson()' – bafdurango

1

prefared方法がある:それはあなたが対処したい見た目ほどあなたの状況で

$keys = Tool::select('name as title','tool_date as start')->whereDate('start','>',$now)->orderBy('start')->take(3)->get(); 

しかし、あなたは組み合わせることはできません。

$tools = Tool::whereDate('tool_date','>',$now)->orderBy('tool_date')->take(3)->get(); 

いつもとして組み合わせの異なるデータで表示およびスクリプト

も、は組み合わせて、以下の変更を行い、それはあなたがしたいですかどうかを確認してみてください。

@foreach($keys as $key) 
{{$key->name}} 
... 
@endforeach 


<script> 
eventSources: [ 
    { 
    events: 
     {!! $keys->toJson !!}, 
     color: 'black',  
     textColor: 'red' 
    } 
]; 
</script> 
+0

私は2番目にこれをスキップする必要があります: ' - > whereDate( 'tool_date'、 '>'、$ now)' '$ keys-> where( 'tool_date'、 '>'、$ now) (3) 'を使用します。そして、これは再び単純化されていますか? –

1

Okこれは、既存のクエリとまったく同じ結果をもたらし、単一のデータベースフェッチでこれを行います。

$allTools = Tool::all(); 

$tools = $allTools->filter(function ($tool) use ($now) { 
    return \Carbon\Carbon::parse($tool->tool_date)->gt(\Carbon\Carbon::parse($now)); 
})->sortBy('tool_date')->take(3); 

$keys = $allTools->transform(function ($tool) { 
    return [ 
     'title' => $tool->name, 
     'start' => $tool->tool_date 
    ]; 
})->toJson(); 

あなたの質問には、あなたのキー用のすべてのツールを取得しますが、最初の条件に合ったツールのキーを提供する回答を受け入れました。

+0

は少し変わっても大丈夫でした。とりあえずありがとう。 –

+0

あなたの期待した結果だったら無駄な努力。次回は、期待している結果についての質問がより明確になり、私たちのような人々があなたの時間を無駄にしないように支援します。良い一日。 – Sandeesh

+0

私はあなたの努力に感謝し、それは無駄ではありません。私もそれを観察した。 –

関連する問題