Laravel 过滤与分页关系为空的记录
Laravel Filter Records with empty relationship with pagination
您好,我想获取排除空值关系的记录。我尝试了很多代码,但没有正确计算出来。这是我的尝试之一:
$product= [];
$product= Product::select('id','ref_num','eta','customer_id')
->when(count($customer_ids) > 0, function($q) use ($customer_ids){
return $q->whereIn('customer_id',$customer_ids);
})
->when(!is_null($ref_num_q_string) && $ref_num_q_string !=='', function($q) use ($ref_num_q_string){
return $q->where('ref_num','like','%'.$ref_num_q_string.'%');
})
->with(['customer' => function($q){
$q->select('id','company_name');
}])
// ->whereExists(function($q){
// $q->select('id','product_id','total_amount')
// ->from('bills')
// ->whereColumn('bills.product_id','products.id');
// })
// ->whereExists(function($q){
// $q->select('id','product_id','total_amount')
// ->from('invoices')
// ->whereColumn('invoices.product_id','products.id');
// })
->with(['bill' => function($q){
$q->with(['bill_items']);
$q->select('id','product_id','total_amount');
}])
->with(['invoice' => function($q){
$q->with(['invoiceServices']);
$q->select('id','product_id','total_amount');
}])
->has('invoice')
->orHas('bill')
->orderBy($sort_by,$sort_type)
->paginate(isset($per_page) ? $per_page : 50);
我在搜索过滤器中使用了“when”子句。
如果我有 1 个“has”方法,它 returns 正确的值但是当我添加“orHas”时出现问题,它 returns 匹配字符串的记录但其他不必要的记录与它们一起。
所以 orHas
和 orWhere
在这里给你带来了一些问题。这些将导致您的其余查询出现问题,这意味着您的其他条件 none 被考虑。您需要在 ->has()
上使用类似于以下内容的闭包:
->has(function ($query) {
$query->has('invoice')
->orHas('bill');
})
->orderBy($sort_by,$sort_type)
->paginate(isset($per_page) ? $per_page : 50);
现在您只会获得包含发票或帐单的行的结果。
在此处查看文档:https://laravel.com/docs/6.x/queries#parameter-grouping
您好,我想获取排除空值关系的记录。我尝试了很多代码,但没有正确计算出来。这是我的尝试之一:
$product= [];
$product= Product::select('id','ref_num','eta','customer_id')
->when(count($customer_ids) > 0, function($q) use ($customer_ids){
return $q->whereIn('customer_id',$customer_ids);
})
->when(!is_null($ref_num_q_string) && $ref_num_q_string !=='', function($q) use ($ref_num_q_string){
return $q->where('ref_num','like','%'.$ref_num_q_string.'%');
})
->with(['customer' => function($q){
$q->select('id','company_name');
}])
// ->whereExists(function($q){
// $q->select('id','product_id','total_amount')
// ->from('bills')
// ->whereColumn('bills.product_id','products.id');
// })
// ->whereExists(function($q){
// $q->select('id','product_id','total_amount')
// ->from('invoices')
// ->whereColumn('invoices.product_id','products.id');
// })
->with(['bill' => function($q){
$q->with(['bill_items']);
$q->select('id','product_id','total_amount');
}])
->with(['invoice' => function($q){
$q->with(['invoiceServices']);
$q->select('id','product_id','total_amount');
}])
->has('invoice')
->orHas('bill')
->orderBy($sort_by,$sort_type)
->paginate(isset($per_page) ? $per_page : 50);
我在搜索过滤器中使用了“when”子句。 如果我有 1 个“has”方法,它 returns 正确的值但是当我添加“orHas”时出现问题,它 returns 匹配字符串的记录但其他不必要的记录与它们一起。
所以 orHas
和 orWhere
在这里给你带来了一些问题。这些将导致您的其余查询出现问题,这意味着您的其他条件 none 被考虑。您需要在 ->has()
上使用类似于以下内容的闭包:
->has(function ($query) {
$query->has('invoice')
->orHas('bill');
})
->orderBy($sort_by,$sort_type)
->paginate(isset($per_page) ? $per_page : 50);
现在您只会获得包含发票或帐单的行的结果。
在此处查看文档:https://laravel.com/docs/6.x/queries#parameter-grouping