2017-09-16 4 views
0

Nous avons deux modèles:Paginate avec Eloquent mais sans instanciation modèles

  • SimpleModel (id, pays, code)
  • ComplexRelatedModel (id, nom, adresse)

SimpleModel a beaucoup ComplexRelatedModel , puis

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

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

Si nous

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

Et nous avons besoin que faire

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

Toute ComplexChild a hydratated et prêt. Cela prend beaucoup de mémoire dans mon cas. Et nous avons besoin d'un seul champ sans aucune fonctionnalité ou caractéristique du modèle.

Il est possible d'utiliser un champ de données à partir d'objets connexes ou avec éloquent ce n'est pas possible?

Répondre

1

Je ne suis pas certain d'avoir complètement compris votre question. Vous voulez uniquement charger un champ de la relation complexRelatedChild pour limiter la limite de mémoire?

Vous pouvez faire:

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

qui peut être simplifié à:

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

Toutefois, si je vous, je voudrais essayer de paginer moins d'articles que 100000.

Mise à jour: Vous pouvez utiliser chunk ou cursor fonctions pour traiter de petits lots de SimpleModel et de garder la limite de mémoire vers le bas.

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

ou

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

Voir la documentation pour plus d'informations

+0

Merci beaucoup pour votre réponse. Grande solution, vous me comprenez bien. (Désolé pour mon mauvais anglais). Si vous pensez que c'est la meilleure solution, génial. Je vous ai un autre meilleur, je vous entends: P J'ai besoin d'un total de ressources parce que le client obtient toutes les données et sincronise avec indexDB une fois par jour. Si je pagine, le client doit obtenir une page par page. – pablorsk

+0

@pablorsk: J'ai mis à jour ma réponse avec une autre option que vous pourriez essayer. Bonne chance! –

+0

votre mise à jour résoudre mon problème! le mauvais côté est de refaire les requêtes SQL. Mais la mémoire utilisée est seulement de 30%. – pablorsk