如何从不同的表中获取 customer_id 并在 laravel 中使用正确的方法避免重复?

Posted

技术标签:

【中文标题】如何从不同的表中获取 customer_id 并在 laravel 中使用正确的方法避免重复?【英文标题】:How to get customer_id from different table and avoid duplications with correct method in laravel? 【发布时间】:2021-06-16 11:37:10 【问题描述】:

您好,我正在尝试从不同的表中获取客户 ID 采购订单、销售订单和寄售商品

然后我遍历这些 Ids 。我为此目的使用的方法运行良好,但是。恐怕如果有很多数据,这种方法可能会失败。这是我的方法。

   $consignmentCustomerIds = Consignment::select('customer_id')->where('is_repeat', 0)->whereDate('created_at','>',date('2021-03-06'))->whereRaw('(is_group = "parent" or is_group is null)')->where('finalize', 0)->where('invoice_id', null)->distinct()->pluck('customer_id')->toArray();
        $poCustomerIds = PurchaseOrder::select('customer_id')->whereDate('created_at','>',date('2021-03-06'))->where('invoice_id', null)->distinct()->pluck('customer_id')->toArray();
        $soCustomerIds = SaleOrder::select('customer_id')->whereDate('created_at','>',date('2021-03-06'))->where('invoice_id', null)->distinct()->pluck('customer_id')->toArray();
        $spCustomerIds = StoragePeriod::select('customer_id')->whereDate('created_at','>',date('2021-03-06'))->where('invoice_id', null)->distinct()->pluck('customer_id')->toArray();

        $ids = array_merge($consignmentCustomerIds, $poCustomerIds, $soCustomerIds, $spCustomerIds);


        $customers = Customer::whereIn('id', $ids)->get();

        foreach ($customers as $customer) 

            CreateInvoiceOneByOne::dispatch($customer)->onQueue('invoice');
        

有没有更好的方法?

【问题讨论】:

【参考方案1】:

主要是在迭代中将->get()改为->cursor()

//      $customers = Customer::whereIn('id', $ids)->get();
        $customers = Customer::whereIn('id', $ids)->cursor();

游标方法可用于在迭代数万条 Eloquent 模型记录时显着减少应用程序的内存消耗。

更多信息:https://laravel.com/docs/8.x/eloquent#cursors

【讨论】:

【参考方案2】:

如果您的关系设置正确 我建议减少数据库查询。您可以通过在客户请求中更改 whereHasorWhereHas 来做到这一点。

Querying Relationship Existence

    $date = date('2021-03-06');

    $customers = Customer::whereHas('consignment', function($query) use($date) 
                                $query->where('is_repeat', 0)->whereDate('created_at','>',$date)->whereRaw('(is_group = "parent" or is_group is null)')->where('finalize', 0)->where('invoice_id', null);
                            )->orWhereHas('purchase_order', function($query) use($date) 
                                $query->whereDate('created_at','>',$date)->where('invoice_id', null);
                            )->orWhereHas('sale_order', function($query) use($date) 
                                $query->whereDate('created_at','>',$date)->where('invoice_id', null);
                            )->orWhereHas('storage_period', function($query) use($date) 
                                $query->whereDate('created_at','>',$date)->where('invoice_id', null);
                            )->get();

    foreach ($customers as $customer) 
        CreateInvoiceOneByOne::dispatch($customer)->onQueue('invoice');
    

我在查询之前设置了$date 变量,这样你就可以在一个地方操作它。

附:我目前正在假设关系的名称。

【讨论】:

以上是关于如何从不同的表中获取 customer_id 并在 laravel 中使用正确的方法避免重复?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL Server 中的表中获取行的索引?

如何使用数组方法通过RMI从数据库的表中获取完整的数据?

如何从不同的表中获取最大版本并加入表?

如何从两个不同的、不相关的表中获取最新的行,并将它们合并到一个结果集中?

如何从不同的表中以最优化的方式获取国家、州、城市名称

优化查询以从不同的表中获取唯一(用户)记录