我如何简化这两个类似的查询?

时间:2017-05-20 10:15:13

标签: php mysql sql laravel

我在控制器的方法中有这两个查询:

    $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]); 

第一种用于刀片:

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

然而,第二个在javascript中用作:

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

                        color: 'black',     
                        textColor: 'red' 
                }
           ]
</script>

如何简化这两个查询并合并为一个?

3 个答案:

答案 0 :(得分:1)

预先准备的方式是:

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

合并作为常规

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

在您的情况下,您无法合并,因为您希望处理查看脚本的不同数据

尝试合并并进行以下更改,看看您是否想要:

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


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

答案 1 :(得分: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

第二次使用:

<script>
eventSources: [
            {
                events:
                        {!! $tools->toJson() !!},

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

这是一个查询,并管理集合。

答案 2 :(得分:1)

好的,这可以为您提供与现有查询完全相同的结果,并使用单个数据库提取。

$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();

在你的问题中,你会获取钥匙的每个工具,但是你已经接受了一个答案,它为你提供了只符合你第一个条件的工具钥匙。