Merhaba arkadaşlar,
Kendime özgü geliştirdiğim bir versyonlama sistemi var. Öncelikle veritabanı üzerinde bir göz gezdirin.
Şimdi bu veritabanında "EC7B9800-6281-7A5B-61C8-B6E2FF012BF5" guid değerine sahip ürünün son versiyonuna (şu anda 19. versiyona denk geliyor) ait resimleri çekmek istiyorum. Bunun için model sorgum şu şekilde;
$product->images = File::where(['attached_id_or_guid' => $product->guid, 'attached_module' => 'product', 'attached_version' => $product->version])->orderBy('order', 'DESC')->get();
Normalde bu kod işimi görüyor. Ama sonradan şöyle bir sıkıntı çıkıyor. Örneğin ben ürün 1. versiyondayken bir resim eklediğimde ürünün ve resminin versiyonu 1 olarak kaydoluyor. Ardından resme dokunmadan ürüne ait başka bir bilgiyi değiştirdiğimde ürünün verisyonu 2 ama resminin versiyonu 1 olarak kalıyor. Resmin versiyonunun değişmemesinin 2 sebebi var. Birincisi o resmi hangi versiyonda ekledim (ne zamandan beri var) , ikincisi veriyi kopyalayıp versiyon yükselterek kopya satırlara engel olmak.
Böyle versiyon farkı olunca sorgu haliyle boş sonuç döndürüyor. Bu sonuçla karşılaşınca bende sorgudan versiyon numarasını çıkarıp denedim ama bu kez de geçmişe dönük tüm versiyonlara ait veriler geldiği için satır sayısı çok fazla artıyor ve benim göstermem gereken resimleri ayıklamak gerekiyor.
File::where(['attached_id_or_guid' => $product->guid, 'attached_module' => 'product'])->orderBy('order', 'DESC')->get();
Bu model sorgusunun sql çıktısı şu şekilde;
SELECT * FROM `files` WHERE(`attached_id_or_guid` = 'EC7B9800-6281-7A5B-61C8-B6E2FF012BF5' AND `attached_module` = 'product' ) ORDER BY `id` DESC
Şimdi burada şöyle bir değişiklik yapmak istiyorum.
SELECT * FROM `files` WHERE(`attached_id_or_guid` = 'EC7B9800-6281-7A5B-61C8-B6E2FF012BF5' AND `attached_module` = 'product' [b]AND attached_version = MAX(attached_version)[/b] ) ORDER BY `id` DESC
Sorgudaki şart kısmına max ekleyince hata veriyor. MySql max sorgusu select kısmında yazılıyor. Bana şart olarak max değeri lazım. İç içe sorgu yazarak şu şekilde çözüme ulaşabiliyorum ama bu da benim işime yaramıyor.
SELECT
*
FROM
`files`
WHERE
(
`attached_id_or_guid` = 'EC7B9800-6281-7A5B-61C8-B6E2FF012BF5'
AND `attached_module` = 'product'
AND attached_version = (
SELECT
MAX(attached_version)
FROM
`files`
WHERE
(
`attached_id_or_guid` = 'EC7B9800-6281-7A5B-61C8-B6E2FF012BF5'
AND `attached_module` = 'product'
)
LIMIT 1
)
)
ORDER BY
`id` DESC
İç içe sorgu yazınca neredeyse aynı şartlar için 2 kez sorgu çalıştığından sorgu süresi ve işlemci yükü artıyor. Satır sayısının çok olduğu durumda iyice gecikiyor. Ek olarak iç içe yapacak olursam eğer yaklaşık 50-60 model/tablo için yazılmış tüm sorguları tek tek güncellemem gerekecek. Kod yazım süreci de iyice artacak.
Umarım derdimi anlatabilmişimdir
Model sorgusu şeklinde kullanacak şekilde nasıl bir değişiklik ile max değerini where şartına ekleyerek sonuç elde edebilirim ?