2017-08-02 2 views
1

Ich habe Company Modell und Contact Modell definiert in meiner Laravel 5.4 Anwendung, beide von ihnen haben viele zu viele Beziehung. So zum Beispiel Kontakt Modell hat:Optimieren von Code mit Chunk oder Cursor in Laravel

public function company() 
{ 
    return $this 
     ->belongsToMany('App\Company', 'company_contact','contact_id', 'company_id')->withTimestamps(); 
} 

Jetzt habe ich einen Datensatz, wo ich alle Kontakte Daten ziehen will und es Firmendaten, so war ich mit:

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); 
} 

Das funktioniert völlig in Ordnung für kleine Datenmenge, aber während die Verwendung einer großen Anzahl von Daten fehlschlägt (ca. 10.000 Felder), denke ich php memory fails zu laden, wenn es um große Datenmenge geht. Ich ging durch Laravel Docs, um die Lösung zu finden und über und cursor() Methoden zu lernen, kann mir jemand sagen, was in diesem Problem getan werden kann, oder was der Ansatz sein kann, um dies zu überwinden.

Dank

+0

Sind Sie mit Chris Fidao der "Laravel Performante" -Serie familar? Er hat ein Video zum Database Chuncking in Laravel, das genau erklärt, was Sie zu implementieren versuchen. Es ist auch kostenlos. https://serversforhackers.com/laravel-perf/database-chunking – Victor

Antwort

2

empfehle ich Ihnen einige Schrulligkeit Ihres Systems, beide Methoden zu testen.

Chunk:

Es wird "Paginieren" Ihre Anfrage, auf diese Weise Sie weniger Speicher. Verwendet

  • weniger Speicher
  • Es dauert länger

`

public function getData() { 
    Contact::chunk(1000, function ($contacts) { 
     foreach ($contacts as $contact) { 
      //rest of your code... 
     } 
    }); 
} 

`

Cursor:

Sie PHP-Generatoren verwenden, um Ihre Abfrage zu suchen i teme eins nach dem anderen.

  • Es dauert weniger Zeit
  • mehr Speicher verwendet

`

public function getData() { 
    foreach (Contact::cursor() as $contact) { 
     //rest of your code... 
    } 
} 

`

Für eine ausführlichere Erklärung diese Antwort sehen: What is the difference between laravel cursor and laravel chunk method?

Für Leistung Prüfung finden Sie in diesem Beitrag: https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=http%3A%2F%2Fqiita.com%2Fryo511%2Fitems%2Febcd1c1b2ad5addc5c9d

+0

Ich möchte keine Daten in Chunks, ich möchte alle Daten in meiner Datenbank vorhanden und zwei weitere Abfrage jeder Daten in foreach-Schleife, so dass ich 'Cursor verwendet() 'Aber es hilft mir nicht aus. –

+0

Der Link, den du geteilt hast, ich hatte ihn bereits durchgegangen, wie ich bereits erwähnt habe, habe ich schon Hintergrundcheck gemacht. –