2017-09-16 4 views
0

我々は2つのモデルがあります:ページ付けは

  • SimpleModel(ID、国、コード)
  • ComplexRelatedModel(ID、名前、住所)

SimpleModelは多くのComplexRelatedModelを持っています、その後、

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

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

我々が行う場合

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

そして、我々は

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

を行う任意のComplexChildがhydratatedと準備ができているだけです。私の場合、これは多くのメモリを必要とします。モデルのファンクションや機能がなくても、1つのフィールドだけが必要です。

関連オブジェクトからデータフィールドを使用することは可能でしょうか、または雄弁にこれは可能ではありませんか?

答えて

1

私はあなたの質問を完全に理解しています。メモリ制限を維持するために、complexRelatedChildリレーションから1つのフィールドだけをロードしますか?

あなたは行うことができます:私はあなただったら、私は100000未満のアイテムをページ付けしようとするしかし

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

:に簡略化することができ

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

を。

更新: あなたはSimpleModelの小さなバッチを処理し、ダウンメモリ制限を維持するためにchunkまたはcursor機能を使用することができます。

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

または

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

詳細については、お使いの応答を

+0

おかげで多くのことをdocumentationを参照してください。 偉大な解決策、あなたは私を素晴らしいと理解しています。 (私の悪い英語には申し訳ありません)。これが最善の解決策だと思うなら、素晴らしい。私はあなたのことをよく聞きます。P クライアントはすべてのデータを取得し、indexDBで1日1回sincronizeするため、リソースが必要です。私がページを設定すると、クライアントはページごとにページを取得する必要があります。 – pablorsk

+0

@pablorsk:私はあなたが試すことができる他の選択肢で私の答えを更新しました。がんばろう! –

+0

あなたのアップデートは私の問題を解決します!悪い面はSQL要求をやり直すことです。しかし、使用されるメモリはわずか30%です。 – pablorsk

関連する問題