2016-03-27 18 views
1

Ben bir Kimyasal veritabanı üzerinde çalışıyorum ve giderken Eloquent öğreniyorum. Bu, Laravali'nin kendisi değil, Slim Framework'te. Bu iş parçacığı bana neye ihtiyacım olduğu konusunda yardımcı oldu, ancak şimdi garip bir şey görüyorum ve pek çok insanın benzer soruları sormasına rağmen bir çözüm bulamadım.Eloquent istekli yüklü sorgu ile birleştiğinde tam çalışma değil

Ben 2 dışarı yorumladı Katıldı

$chemicals = $app->Chemical->with(array('Company', 'Room', 'Location', 'Measurement')) 
->join('company', 'company_id', '=', 'company.id') 
//->join('room', 'room_id', '=', 'room.id') 
//->join('location', 'location_id', '=', "location.id") 
->where('company', '=', 'ROUSSEL') 
->get(); 

Bildirimi var. Bu 2 alan, tablomda düzgün görüntüleniyor, ancak şirket boş. Hangi birleşimin gösterileceğini değiştirirsem, takım elbise takip eder.

Eğer herhangi bir birleşimi kullanmazsam, kimyasal alanlardan biriyle iyi bir şekilde yapabilirim. Benim sorum, bir katılımın neden bu özel ifadeyi kırdığı gibi görünüyor ve bunu düzeltmenin bir yolu var mı? Ben bir sahne ile birleştirmek bir şey yapmanın bir şey olduğunu hissediyorum hissediyorum, ama ben herhangi bir özellik bulamadık .. Teşekkür,

Kısıtlamadan önce de. dışarı yorumladı beni nereye kimyasallar tablosu doğrudur şirket adı verilen bir sütun, yok mesajı veriyor olmadan yukarıda kullanma

$chemicals = $app->Chemical->with(
array(
    'Company', 
    'Room', 
    'Measurement', 
    'Location' => function ($query) { 
     $query->where('location', '=', 'FLAMCAB'); 
    } 
)) 
//->where('company', '=', 'FISHER') 
->get(); 

. bunu kullanarak değil , ben sonuç almak yapın:

bunu yerleri tabloya filtre yapar görebileceğiniz gibi

Table when using the eager loading constraint

ama bu ben budur, yani tarafından kimyasalları filtre olmayan tek bunu yapar yapmaya çalışıyorum. Eğer bunlarla ilgili yerler dayalı Kimyasalları filtre uygulamak istiyorsanız

+0

"join" kullanmanız gerekiyor mu? [İlişkiler] 'e (https://laravel.com/docs/5.1/eloquent-relationships) henüz baktınız mı? – alexw

+0

Merhaba @alexw, Bu özel sorgu için yapmam gerektiğini düşündüm. Bir Kimyasalın ait olduğu ilişkiyi bu 4 nesnenin her birine ve ben de bir Kimyasal'a aittir. Orada yapmaya çalıştığım şeyi yapmak için kullanabileceğim bir şey var mı? – danny2327

+0

Demek istediğim: (ve son sorusundan şemanızı hatırlarsam), 'join' cümleleri gereksiz görünüyor. Bana öyle geliyor ki, yaptıkları tüm kimyasallar için ilgili şirketi, odayı ve yeri kapıyor. Ancak, zaten 'ait olan' ilişkilere sahipseniz, 'with' maddesinin, her bir kimyasal için ilişkili şirket, oda ve konum elde etmek için yeterli olması gerekir. – alexw

cevap

0

, sen querying relationship existence ile constraining eager loads birleştirebilirsiniz:

$filter = function ($query) { 
    $query->where('location', '=', 'FLAMCAB'); 
}; 

$chemicals = $app->Chemical->with(
    array(
     'Company', 
     'Room', 
     'Measurement', 
     'Location' => $filter 
    ) 
    ->whereHas('location', $filter) 
    ->get(); 

Ben ne kadar etkili bu olsa olduğundan emin değilim - sonuçta ortaya çıkan sorgu kontrol etmek isteyebilirsiniz . Başka bir seçenek de, sorguyu çalıştırdıktan sonra Collection filters kullanarak koleksiyona filtre uygulamaktır.

Bu soru: Complex query with filters with Eloquent da size yardımcı olabilir.

+0

Gönderiyi güncelledim. – danny2327

+0

Bu cevap çalışır. Çok havalı. Ben sorgu dosyasına baktım ve çok kötü görünmüyor. Tabii ki şu anda sadece yarım düzine girişi var ama her şey söylendiğinde ve yapıldığında 2000'e yakın olacağım. Bu noktaya geldiğimde, biraz daha test yapacağım ve eğer gerçekten yavaşsa, daha sonra filtrelemeyi seçeceğim. Deneyimlerinizde, hangisinin daha hızlı olacağını düşünüyorsunuz? Çabalarınız için çok teşekkür ederim – danny2327

+0

Zor bir çağrı. Eloquent, 'whereHas' için ekstra bir sorgu üretmek zorundaysa, o zaman sonuçlarınızı birleştirmek için koleksiyonunuzu yine de yürümek zorunda kalacak. Koleksiyona başka bir sorguya ihtiyaç duymadan yürüyebilirseniz, bu muhtemelen daha hızlı olacaktır. Ancak emin olmanın tek yolu, zamanı ölçmektir (örneğin, ['microtime()'] ile (http://php.net/manual/en/function.microtime.php)) – alexw

İlgili konular