问题
I'm having Company
Model and Contact
Model defined in my Laravel 5.4
application, both of them have many to many relationship. So, for example contacts model has:
public function company()
{
return $this
->belongsToMany('App\Company', 'company_contact','contact_id', 'company_id')->withTimestamps();
}
Now I've a data set where I want to pull all contacts data and there company details so I was using:
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);
}
This works perfectly fine for small data set, but while using large number of data it fails (approx 10,000 fields), I guess php memory fails
to load when it comes to large data set. I was going through Laravel
docs to find out the solution and came to know about chunk()
and cursor()
methods, Can someone guide me what can be done in this problem or what can be the approach to overcome this.
Thanks
回答1:
I recommend you to test both methods for some quirkiness of your system.
Chunk:
It will "paginate" your query, this way you use less memory.
- Uses less memory
- It takes longer
`
public function getData() {
Contact::chunk(1000, function ($contacts) {
foreach ($contacts as $contact) {
//rest of your code...
}
});
}
`
Cursor:
You will use PHP Generators to search your query items one by one.
- It takes less time
- Uses more memory
`
public function getData() {
foreach (Contact::cursor() as $contact) {
//rest of your code...
}
}
`
For a more detailed explanation see this answer: What is the difference between laravel cursor and laravel chunk method?
For performance testing see this post: https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=http%3A%2F%2Fqiita.com%2Fryo511%2Fitems%2Febcd1c1b2ad5addc5c9d
来源:https://stackoverflow.com/questions/45467100/optimizing-code-with-chunk-or-cursor-in-laravel