Laravel过滤与分页关系为空的记录

Posted

技术标签:

【中文标题】Laravel过滤与分页关系为空的记录【英文标题】:Laravel Filter Records with empty relationship with pagination 【发布时间】:2021-07-22 17:59:33 【问题描述】:

您好,我想获取排除与空​​值的关系的记录。我尝试了很多代码,但没有正确解决。这是我的尝试之一:

$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”方法,它会返回正确的值,但是当我添加“orHas”时,问题就出现了,它会返回与字符串匹配的记录,但其他不必要的记录也会出现。

【问题讨论】:

【参考方案1】:

所以orHasorWhere 在这里给你带来了一些问题。这些将导致您的其余查询出现问题,这意味着您的其他条件都不会被考虑。您需要在 ->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

【讨论】:

谢谢哥们...我实际上对“has”有误,但我是这样做的:->where(function ($q) $q->whereExists(function($q2) $q2->select('id','shipment_id','total_amount') ->from('bills') ->whereColumn('bills.product_id','shipments.id'); ) ->orWhereExists(function($q3) $q3->select('id','product_id','total_amount') ->from('invoices') ->whereColumn('invoices.product_id','shipments.id'); ); ) 感谢您拯救了这一天。

以上是关于Laravel过滤与分页关系为空的记录的主要内容,如果未能解决你的问题,请参考以下文章

Loopback在哪里与子页面关联过滤与分页

Laravel:创建可以为空的 morphs() 关系

Laravel Yajra Datatable 问题与分页和 recordsFiltered

表格的排序过滤与分页

使用 Laravel ORM 抽象保存新的不可为空的关系,而不会违反数据库完整性约束

更新 laravel 关系中的许多记录