2017-09-16 6 views
0

Wir haben zwei Modelle:Paginate mit Eloquent aber ohne Instanziierung Modelle

  • SimpleModel (id, Land, Code)
  • ComplexRelatedModel (id, Name, Adresse)

SimpleModel hat viele ComplexRelatedModel , dann

class Product extends Model 
{ 
    protected $fillable = [ 
     'name' 
    ]; 

    /* hasOne */ 
    public function complexRelatedChild() 
    { 
     return $this->hasOne(self::class, 'parent_id', 'id'); 
    } 
} 

Wenn wir das tun

$simples = SimpleModel 
     ->with('complexRelatedChild') 
     ->simplePaginate(100000 /* a lot! */); 

Und wir brauchen nur tun

foreach ($simples as $simple) { 
    echo $simple->complexRelatedChild->name; 
} 

Jede ComplexChild hat hydratated und fertig. Das kostet in meinem Fall viel Speicher. Und wir brauchen nur ein Feld ohne irgendeine Funktion oder Funktion von Model.

Es ist möglich, ein Datenfeld von verwandten Objekt oder mit eloquent verwenden dies ist nicht möglich?

Antwort

1

Nicht sicher, dass ich Ihre Frage vollständig verstehe. Sie möchten nur ein Feld aus der complexRelatedChild-Beziehung laden, um das Speicherlimit niedrig zu halten?

Sie könnten tun:

$simples = SimpleModel::with(['complexRelatedChild' => function($query){ 
       return $query->select(['id', 'name']); 
      }) 
      ->simplePaginate(100000); 

Welche vereinfacht werden kann:

$simples = SimpleModel::with('complexRelatedChild:id,name') 
      ->simplePaginate(100000); 

Allerdings, wenn ich Sie wäre, würde ich weniger Einzelteile als 100000 Paginieren versuchen.

Update: Sie könnten chunk oder cursor Funktionen verwenden, um nach unten kleine Chargen von SimpleModel und halten Speicherlimit zu verarbeiten.

SimpleModel::chunk(200, function ($simples) { 
    foreach ($simples as $simple) { 
    } 
}); 

oder

foreach (SimpleModel::cursor() as $simple) { 
} 

Siehe documentation für weitere Informationen

+0

vielen Dank für Ihre Antwort. Große Lösung, Sie verstehen mich großartig. (Entschuldigung für mein schlechtes Englisch). Wenn Sie denken, dass dies die beste Lösung ist, großartig. Ich habe dich noch besser, ich höre dich: P Ich brauche insgesamt Ressourcen, weil der Client alle Daten und sincronize mit IndexDB einmal pro Tag. Wenn ich paginiere, muss der Client eine Seite pro Seite erhalten. – pablorsk

+0

@pablorsk: Ich habe meine Antwort mit einer anderen Option aktualisiert, die Sie ausprobieren könnten. Viel Glück! –

+0

dein Update löst mein Problem! Die schlechte Seite ist wieder die SQL-Anfragen. Aber Speicher ist nur 30%. – pablorsk

Verwandte Themen