在laravel中使用块或光标优化代码

问题描述 投票:2回答:1

我在我的Company应用程序中定义了Contact模型和Laravel 5.4模型,它们都有很多甚至很多关系。因此,例如联系人模型具有:

public function company()
{
    return $this
        ->belongsToMany('App\Company', '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()方法,有人可以指导我在这个问题上可以做些什么,或者可以采取什么方法来克服这个问题。

谢谢

laravel eloquent laravel-5.4 laravel-eloquent
1个回答
5
投票

我建议你测试两种方法以获得系统的某些怪癖。

块:

它将“分页”您的查询,这样您使用更少的内存。

  • 使用较少的内存
  • 需要更长的时间

`

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

© www.soinside.com 2019 - 2024. All rights reserved.