Php Laravel查询生成器-选择其他表具有其ID的所有表

Php Laravel查询生成器-选择其他表具有其ID的所有表,php,mysql,laravel,laravel-5,eloquent,Php,Mysql,Laravel,Laravel 5,Eloquent,基本上,如果另一个表中有符合某些条件的记录,我将尝试使用查询生成器从表中选择所有内容。目前,我有下面的代码,但是对于一个有100K行的表来说,速度非常慢 $result= []; $customers = (array)DB::table('customers')->where('lastName','LIKE', Input::get('letter').'%')->orderBy('lastName','ASC')->get(); foreach($

基本上,如果另一个表中有符合某些条件的记录,我将尝试使用查询生成器从表中选择所有内容。目前,我有下面的代码,但是对于一个有100K行的表来说,速度非常慢

 $result=  [];

    $customers = (array)DB::table('customers')->where('lastName','LIKE', Input::get('letter').'%')->orderBy('lastName','ASC')->get();

    foreach($customers as $k => $v)
    {
        if(DB::table('orders')->where('disabled','=','')->where('customerId','=',$v->id)->where('status','!=',0)->count() > 0)
        {
            array_push($result, $v);
        }
    }

任何建议都将不胜感激!目前,这将在5分钟后超时。

目前,您正在运行一个查询以获取客户,然后是一个查询,用于每个客户获取相关订单。如果您有许多客户,那么将导致需要执行大量查询

通过连接这两个表,您可以通过单个查询来实现这一点

这将实现以下目的:

//get all customers
$results = DB::table('customers')
  //filter customers by lastName
  ->where('customers.lastName','LIKE', Input::get('letter').'%')
  //take only customers that have orders matching criteria below
  ->join('orders', function($query) {
    //link customer to their orders
    $join->on('orders.customerId', '=', 'customers.id');
    //consider only enabled orders
    $join->where('orders.disabled','=','');
    //consider only orders where status != 0
    $join->where('orders.status','!=',0);
  })
  //if customer has multiple orders matching criteria 
  //they will be returned multiple time, so you need to group by
  //customers.id to get only one row per customer
  ->groupBy('customers.id')
  //order by customers last name
  ->orderBy('customers.lastName','ASC')
  ->get();

你可以试试这样的

$data = Customer::with('Order') -> where('lastName','like',$name) -> whereExists(function($query){
$query->select(DB::raw(1)) -> from('orders')
 ->whereRaw('orders.customer_id= customer.id')
 ->where('disabled','=','')
 ->where('status','!=',0);
})-> orderBy('lastname','ASC')  -> get() ->toArray();

感谢您的支持,但是它会返回订单不符合标准的客户。无论如何,不包括这些?不可能,这是一个内部连接,因此如果没有订单匹配,客户将不会被退回。能否将get()替换为toSql(),转储$results并粘贴到此处?让我们看看生成了什么SQL您是否尝试过使用即时加载?