使用一个查询从一个表中获取数据,并将不同的行过滤为单独的变量(Laravel 5.1)

时间:2015-10-23 05:45:58

标签: php laravel laravel-5.1

我理解这个问题可能不太清楚,但这是我的情况。我正在使用laravel 5,我正在开发一个CRM系统。我已将婚姻状况和性别/性别置于一个查找表中。每当我从数据库中获取值并将其传递给视图时,我有两个单独的查询。

$sexes = DB::table('Lookups')
         ->where('ValueType', '=', 'Sex')->get();`

$marstatus = DB::table('Lookups')
         ->where('ValueType', '=', 'Marital Status')->get();`

return view('clients.edit',compact('client'))
        ->with('sexes', $sexes)
        ->with('marstatus ', $marstatus );

此代码实际上有效,我能够在我的观点中同时获得婚姻状况和性别/性别。

所以,这是我的问题

  1. 这是不是意味着我要向数据库发送两次查询,这会影响性能,即使它很小
  2. 是否有办法在一个查询中查询查找表中的所有值,并过滤掉控制器上的值。所以它可能像

    $ Lookups = DB :: table('Lookups')

  3. 然后过滤$ Lookups变量并根据我的过滤条件将其分配到两个不同的变量($ sexes和$ marstatus)。即($ sexes适用于ValueType ='Sex'......)

    1. 哪一个更适合表现。发送查询两次或三次或仅过滤控制器上的数据。

3 个答案:

答案 0 :(得分:1)

1)是的确如此。只需安装Laravel Debugbar并亲自查看即可。它是强烈推荐的非常方便的工具。

2)是的,你可以做到这一点,laravel为这类需求提供了很好的辅助函数:

$collection = collect(DB::table('Lookups')
                        ->whereIn('ValueType', ['Marital Status', 'Sex'])
                        ->get());

$marstatus = $collection->filter(function($item) {
   return $item->ValueType == 'Marital Status';
});


$sexes = $collection->filter(function($item) {
   return $item->ValueType == 'Sexes';
});

这样做,它将结果数组转换为Laravel Collection,以便您可以使用过滤器功能。您还可以使用array_filter函数进行过滤,而无需将结果数组转换为集合。

3)数据库始终是主要瓶颈之一,查询数量越少越好。但是,这不应该是一般规则,尤其是在使用缓存时。例如,在某些情况下,制作连接或子查询以减少查询数量将是致命的错误。

表演是一个很大的主题。我建议您从Laravel Debugbar开始,比较内存使用情况,查询数量等,并研究各种技术,包括缓存和设计模式。直接在控制器内访问表格首先不是一个好主意...

答案 1 :(得分:0)

  1. 是的,这意味着。你的Lookups表有多大?

  2. 你可能意味着$ lookups = DB :: table('Lookups') - > all();或者也许考虑使用Eloquent模型类,例如$ lookups = Lookup :: all();如果表很小,也许你可能想要缓存结果?例如使用Laravel中的Cache类。

  3. 更好的表现就是使用缓存。

答案 2 :(得分:0)

  1. 它属于您的查询数据我的意思是您的 $sexes_marital_status= DB::table('Lookups')->where('ValueType', '=', 'Sex') ->orWhere('ValueType' '=', 'Marital Status' ) ->get(); return view('clients.edit',compact('client')) ->with('sexes_marital_status',$sexes_marital_status); 表数据。
  2. 您可以一次编写这样的查询:

    const audio = React.findDOMNode(this.refs.audio);
    const seeker = React.findDOMNode(this.refs.seeker);
    const {left, right} = seeker.getBoundingClientRect();
    const seekToPerc = (event.clientX - left) / (right - left);
    
    audio.currentTime = this.props.totalRunTime * seekToPerc;
    

    这样您最好一次发送查询。

  3. `