在laravel中使用块或光标优化代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在laravel中使用块或光标优化代码相关的知识,希望对你有一定的参考价值。
我在我的Company
应用程序中定义了Contact
模型和Laravel 5.4
模型,它们都有很多甚至很多关系。因此,例如联系人模型具有:
public function company()
{
return $this
->belongsToMany('AppCompany', 'company_contact','contact_id', 'company_id')->withTimestamps();
}
现在我有一个数据集,我想要提取所有联系人数据和公司详细信息,所以我使用:
public function getData()
{
$contacts = Contact::all();
foreach($contacts as $contact)
{
$getCompany = $contact->company()->withPivot('created_at')->orderBy('pivot_created_at', 'desc')->first();
$getCompany->contacts = Company::find($getCompany->id)->contacts;
$contact->company = $getCompany;
$contact->companies_interested = json_decode($contact->companies_interested);
$companies = [];
if($contact->companies_interested)
{
foreach($contact->companies_interested as $companiesInterested)
{
$getCompany = Company::withTrashed()->find($companiesInterested);
$companies[] = array(
'value' => $getCompany->id,
'label' => $getCompany->name
);
}
$contact->companies_interested = json_encode($companies);
}
}
return response()->json([
'model' => $contacts
], 200);
}
这适用于小型数据集,但是虽然使用大量数据失败(大约10,000个字段),但我想php memory fails
在大数据集时会加载。我正在通过Laravel
文档找出解决方案,并了解了chunk()
和cursor()
方法,有人可以指导我在这个问题上可以做些什么,或者可以采取什么方法来克服这个问题。
谢谢
答案
我建议你测试两种方法以获得系统的某些怪癖。
块:
它将“分页”您的查询,这样您使用更少的内存。
- 使用较少的内存
- 需要更长的时间
`
public function getData() {
Contact::chunk(1000, function ($contacts) {
foreach ($contacts as $contact) {
//rest of your code...
}
});
}
`
光标:
您将使用PHP生成器逐个搜索查询项。
- 这花费的时间更少
- 使用更多内存
`
public function getData() {
foreach (Contact::cursor() as $contact) {
//rest of your code...
}
}
`
有关更详细的解释,请参阅此答案:What is the difference between laravel cursor and laravel chunk method?
有关性能测试,请参阅以下文章:https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=http%3A%2F%2Fqiita.com%2Fryo511%2Fitems%2Febcd1c1b2ad5addc5c9d
以上是关于在laravel中使用块或光标优化代码的主要内容,如果未能解决你的问题,请参考以下文章
需要一种有效的方法来避免使用 Laravel 5 重复代码片段