如何从不同的表中获取 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】:如果您的关系设置正确
我建议减少数据库查询。您可以通过在客户请求中更改 whereHas
和 orWhereHas
来做到这一点。
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 中使用正确的方法避免重复?的主要内容,如果未能解决你的问题,请参考以下文章