2017-09-16 7 views
0

우리는 두 가지 모델이 있습니다페이지를 매기는

  • 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

잘 모르겠습니다. 귀하의 질문을 완전히 이해합니다. 메모리 제한을 유지하기 위해 complexRelatedChild 관계에서 하나의 필드 만로드 하시겠습니까?

당신은 할 수 : 내가 당신이라면 그러나, 나는 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를 하루에 한 번씩 sincronize하기 때문에 총 자원이 필요합니다. 페이징하면 클라이언트가 페이지 당 페이지를 가져와야합니다. – pablorsk

+0

@pablorsk : 시도 할 수있는 다른 옵션으로 답변을 업데이트했습니다. 행운을 빕니다! –

+0

업데이트로 내 문제를 해결하십시오! 나쁜 측면은 다시 SQL 요청을 만드는 것입니다. 그러나 사용 된 메모리는 30 %에 불과합니다. – pablorsk

관련 문제