Magento'daki koleksiyon nasıl klonlanır?


12

Bu koleksiyon üzerinde iki farklı işlem gerçekleştirmek istediğim bir yöntemde bir koleksiyon var. Bu yüzden, aynı koleksiyonun iki ayrı kopyasını istiyorum ve sonra iki koleksiyondan birini tekrar orijinal koleksiyona atayıp iade ediyorum.

Bunu basitleştirmek için, bir nesne koleksiyonum olduğunu varsayalım $collection.

Şimdi, herhangi bir Magento koleksiyonu dahili klonlama ya da değil olup olmadığını bilmiyorum gibi PHP klonlama ile çalışıyorum.

$coll1 = clone $collection;
$coll2 = clone $collection;

Şimdi orijinal koleksiyonun bu iki ayrı klonu üzerinde farklı işlemler yapmaya çalışıyorum.

$coll1->getSelect()->where('some where condition');
$coll2->getSelect()->where('some different where condition');
if($coll1->count() == 0) {
    $collection = $coll2;
} else {
    $collection = $coll1;
}

Ama garip olan şey, bu klonlanmış koleksiyonların her ikisinin de nerede verildiği koşulları var! $ coll2 koşulu, $ coll2 koşuluyla birlikte $ coll2 öğesine uygulanır ve bunun tersi de geçerlidir.

Bunu nasıl başaracağını bilen var mı?

Teşekkürler!

Yanıtlar:


14

Derin klonlamanın istendiği PHP klonlama işlecinin kullanımı, nesneleri kopyalayan sınıfları, nesneleri kopyalamak için __clone yöntemini uygulayan sınıflar gerektirir. Bunu tanımlamazlarsa, her iki örnekteki özellikler de aynı nesneye başvurur.

Magento, toplama özetleri üzerinde __clone uygulamıyor ve bu nedenle istediğiniz gibi derin klonlamayı desteklemiyor.

Benim önerim, bir koleksiyonu klonlamak oldukça pahalı olabileceğinden, yapmak istediğiniz şeyi başarmanın başka yollarını aramaktır.

Verdiğiniz örnek (örneğin) seçimi klonlamak, yükleyeceği kayıtların sayısını seçmek üzere değiştirmek ve daha sonra bu sonuca dayanarak koleksiyonu değiştirmek için değiştirilebilir. Bir koleksiyonu yüklemeyip yalnızca hangisini kullanacağınızı belirlemek için saymayacağınız için bu da daha iyi performans gösterecektir.

DÜZENLEME: Aşağıda, koleksiyonu yüklemeden veya gerçekten değiştirmeden bir sayının nasıl alınacağı gösterilmiştir.

$collection = Mage::getModel(...)->getCollection();

$count = $collection->getSelectCountSql();
$count->where('some where condition');
if ($count->query()->fetchColumn() == 0) {
    ...
} else {
    ...
}

Sadece küçük bir detay: $collection->getSelect()Koleksiyonun kendisinde değil , nerede saklandığına dair bilgiler .
Fabian Blechschmidt

Cevap için teşekkürler. Ama nereye koşul uyguladıktan sonra sadece toplama sayısını bilmek istiyorum ve bu sayıya dayanarak sadece farklı yerde koşul kullanılıp kullanılmayacağına karar vermek istiyorum. Nasıl yapılacağını daha iyi anlamak için bazı kod pasajları gönderebilir misiniz?
MagExt

Yanıt bir kod örneği ile güncellendi. @FabianBlechschmidt'in işaret ettiği gibi, seçim nesnesi klonlandığında ve her ikisi de aynı seçme nesnesi örneğine başvurduğunda klonlanmadığından belirli sorununuzun geldiği seçimde nerede.
davidalger

Güncelleme için teşekkürler. Çözümü zaten sadece böyle bir şey aldığım için denemedim.
MagExt

Aslında koleksiyonu klonlamada bir sorun varsa, serileştirme ve serileştirme işlemi bu süreçte yardımcı olabilir. PHP'de klonlamak için oldukça iyi olan başka alternatifler de vardır. Ama sonuçta David doğrudur ... temelde nesneyi klonladığınızda, cevabı altta yatan sorunu düzgün bir şekilde belirtmese de, işaretçileri ona bağlı iç içe Nesnelere de klonluyorsunuz.
mprototype

1

@ Davidalger'ın cevabını genişletmek için, sayıdan farklı bir işlem yapmak istiyorsanız seçimi sıfırlayabilirsiniz :

$select= $collection->getSelectCountSql()->reset();

$select
    ->from('newsletter_subscriber', array('some_column'))
    ->distinct();

Yine de, koleksiyonun değiştirilmesinden bu durumun ileride zararlı etkileri olabilir.

Seçimi bir şekilde klonlamak daha iyi bir yol olabilir, ancak nesne karmaşık türler içerdiğinden (Varien_Db_Select veya Zend_Db_Select'in bir __cloneyöntemi olduğu için) sığ bir kopya kesilmez .

Bu sorunu aşmanın bir yolu, seçilen verileri kaydetmek, değiştirmek, sorgunuzu çalıştırmak ve ardından orijinal seçme verilerini geri koymaktır.

Bir örnek için buraya bakın: https://ka.lpe.sh/2013/05/23/magento-clone-collection-how-to-clone-collection-in-magento/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.