2015-11-05 16 views
5

ben toSql()Sorgu izin bellek sınırı tüketmektedir

ile bunu yapmak

select * 
from `users` 
where (`active` = 1 and `newsletter` = 1) and (`terminated` = 0 or (`terminated` = 1 and `newsletter_terminated` = 1)); 

Böyle anlamlı ile inşa ediyorum (yukarıdaki sorgu çıktısını alır gerçekten, çok basit bir sorgu var

$recipients = User::where([ 
    'active' => 1, 
    'newsletter' => 1 
])->where(function ($query) { 
    $query->where('terminated', 0) 
     ->orWhere(function ($query){ 
      $query->where('terminated', 1) 
       ->where('newsletter_terminated', 1); 
     }); 
})->get(); 

Ama sp yazarken hatası

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in /xxx/eloquent/vendor/illuminate/database/Illuminate/Database/Connection.php on line 303 

alıyorum bu komut dosyası çalıştırdığınızda get yöntemindeki ek sütunlar, get(['id']); gibi sorunsuz çalışır. Ama yine de neden işe yaramadığını anlamıyorum. Bellek sızıntısı var gibi görünüyor, ama nerede?

Sorguyu SQL istemcimde yürüttüğümde, sorgu 3 ms ile bitiyor, dolayısıyla çok fazla veri oluyor gibi görünmüyor. Ne yazık ki, yüklü vagrant kutusunda xdebug yok, bu yüzden şu anda stacktrace alamıyorum.

+0

Kullandığınız zaman ne olur? (['Field1', 'field2', ...]); Tablodaki tüm sütunlar için? –

+0

Ne yazık ki bu aynı hata veriyor – Musterknabe

+0

Sorgu kaç kayıt döndürüyor? –

cevap

1

Benzer sorunlar yaşadım ve bunun Laravel'e özgü olduğunu sanmıyorum - gömülü kapaklarla ilgisi var. Temel olarak, bu kapanışları yorumlayan ve gömülü kapaklar için yeterli olmayan işlem için 128MB'lık fazla taşıyorsunuz.

Ya php.ini (512MB hile yapmalısınız) içinde memory_limit öğenizi artırmayı deneyin, kapatmalarınızı açın veya yalnızca bu sorguyu yapmak için ham bir SQL deyimi kullanın.

2

Benzer bir şey bana da oldu. Modelinizdeki $ with özelliğini kontrol edin. Belki de otomatik olarak yüklenen çok fazla ilişkiniz var. Bunu yapmamaya çalış. Her nesne hafızayı ayırır. Birçok ilişkide 15000 satır varsa ve her birini yüklemek için istekli iseniz, bellek patlar. Ham bir mysql sorgu yazmayı ve çözdüm problemi çözdüm.

İlgili konular