2014-09-10 63 views
5

Laravel modelimi, bazı yönergelere, daha sonra take ve skip önceden tanımlanmış sayılarla eşleşmesi gerekebilecek sonuçlar için elverişli kullanarak sorgulamak istiyorum."Take" ve "atla" kullanmadan önce Laravel'in Eloquent satır sayısını alın

Bu kendi başına bir sorun değildir, ancak alma ve atlama ile sonuç kümesini azaltmadan önce sorguda bulunan satır sayısını bilmem gerekir - böylece her satırın olabileceği orijinal eşleşme sayısı Tabloda, eğer hiçbir yerde kullanılan maddeler yoksa ya da ikisi de kullanılıyorsa.

Yapmak istediğim şey, sorguyu iki kez yaparak, ilk önce "->take($iDisplayLength)->skip($iDisplayStart)" ihmal ederek ve bunu sayarak başarılabilirdi, ancak bu sadece dağınık görünüyor.

Herhangi bir düşünce?

$contacts = Contact::where(function($query) use ($request) 
{ 

    if (!empty($request['firstname'])) { 
     $query->where(function($query) use ($request) 
     { 
      $query->where('firstname', 'LIKE', "%{$request['firstname']}%"); 

     }); 
    } 

    if (!empty($request['lastname'])) { 
     $query->where(function($query) use ($request) 
     { 
      $query->where('lastname', 'LIKE', "%{$request['lastname']}%"); 

     }); 
    }  

}) 
->take($iDisplayLength)->skip($iDisplayStart)->get(); 

$iTotalRecords = count($contacts); 
+0

:

select * from table where (X or Y) and (A or B); 

Yani bunun gerek Özetle 'count' ve 'take() -> skip() -> get()' işlevlerini çağırın; –

+0

Nasıl üzgünüm demek istiyorsun? Şüphesiz bütün - $ contact = Contact :: where (function ($ query) kullanımı ($ request) .... - her seferinde tekrarlamak zorundayım? –

+0

Hayır, cevap vermeyin. –

cevap

16

count ve get aynı sorguyu kullanabilirsiniz. Bu arada, tüm sorgunuz biraz karmaşıktır. Böyle bir şey olur:

where yılında Kapatma örneğin böyle bir sorgu yapmak için kullanılır
select * from `contacts` where ((`firstname` like ?) and (`lastname` like ?)) limit X, Y 

: Sadece

$query = Contact::query(); 

if (!empty($request['firstname'])) { 
    $query->where('firstname', 'like', "%{$request['firstname']}%"); 
} 

if (!empty($request['lastname'])) { 
    $query->where('lastname', 'like', "%{$request['lastname']}%"); 
} 

$count = $query->count(); 

$contacts = $query->take($iDisplayLength)->skip(iDisplayStart)->get(); 
+0

Teşekkürler, ben de bunu anladım, $ query = DB :: table ('contacts') kullandım, ancak diğer her şey aynı: –

+2

Ancak sonuç tamamen farklı Sen ar ile bitti Eloquent Collection yerine stdObjects ışını. –

+0

'$ query-> count', çoğu vakada yanlış sonucu döndürür ... birleşme veya herhangi bir şey yüzünden olabilir, ancak kesinlikle ne yazık ki ... – IceFire

4

Collection sınıf bir ek yeri ve yararlanabilir bir sayım yöntemi sunmaktadır.

Önce koleksiyonunu almak isteyeyim

..

$collection = $query->get(); 

Sonra sayısını elde etme ve bunu birleştirebilirler. Eğer tüm koleksiyonu her zaman için sorgulama yerine sorguya bir limit koyarak çünkü bu sayfayı sık sık vurmak olacak eğer toplama önbelleğe faydalı olabilir böylece

$count = $collection->count(); 
$records = $collection->splice($iDisplayStart, $iDisplayLength); 

Bu performansa zor olabilir . Aynı zamanda, bu, veritabanına sadece bir kez vuracak, bu yüzden biraz ticarete kapalı.

+0

Yukarıdaki ileti, yalnızca SQL'den gereken sonuçları aldığından daha etkilidir, iki sql sorgusuyla sonuçlanır (sonuç için bir tane ve bir sonuç elde etmek için), ancak bu, gereksiz sonuçlara ulaşmaktan daha iyidir. – Loren

+0

Çok fazla sonuç döndürmeyen pahalı bir sorgu, PHP'nin bunu işlemesine izin vermek daha hızlı olacaktır.Ayrıca iki sorgu kullanıyorsanız, eğer ekleme/güncelleştirme/silme ifadeleri de varsa yanlış bilgi alma potansiyeli vardır. Her iki çözüm de kullanım durumuna bağlı olarak düşünülmelidir – user3158900

İlgili konular