Bir HABTM dernek tutulan kalemler için saklanması sıralama düzeni - CakePHP

3 Cevap php

Bir ActiveRecord (CakePHP aromalı) kurulumunda ben Videolar ve Kovaları bir HasAndBelongsToMany dernek kurulum var: Bir Bin Videolar n referanslar saklayabilir ve Videolar n Kovalarının ait olabilir.

Ben elle ayarlamak mümkün olacak ve belirli bir Kutusu'na içindeki Videoları ekran sırasını saklamak gerekir (yani istemci Kutusu'na içinde belirli bir sırayla onun videolar olabilir.) Benim ilk düşünce bir depolayan Kutusu'na bir alan oluşturmak için göründükleri için gereken sırayla video kimlikleri dizisi. Bu işlemek için en etkili yolu nedir?

Eğer öyleyse o zaman HABTM sorgu sonucu olsun, yeniden sipariş kimlikleri arasında sıralanmış dizi maç için döndürülen sorgu için temiz / en etkili yolu nedir?

Bir Bin ile ilgili videolar bir dizi olarak döndürülür:

[Video] => Array
            (
                [0] => Array
                    (
                        [id] => 49b2de95-0338-48b9-bc88-01ba35664358
                        ...

                    )

                [1] => Array
                    (
                        [id] => 49b1ccad-b770-410e-be46-03a035664358
                        ...
            )

Yoksa HABTM dernekler kullanmadan yapmaya çalışıyorum ne ulaşmak için daha iyi bir yolu var mı?

Şimdiden teşekkürler -

3 Cevap

HABTM karmaşık hale geldiğinde ne yapmalı?

Bir HasAndBelongsToMany ilişki kaydederken varsayılan olarak, Cake yenilerini kaydetmeden önce katılmak tablodaki tüm satırları silecektir. Eğer ilişkili 10 Çocuklar olan bir kulüp varsa Örneğin. Daha sonra 2 çocuklu Kulübü güncelleyin. Kulüp, sadece 2 Çocuklar, değil 12 olacak.

Ayrıca (oluşturulduktan veya meta bilgileri zaman) katılmak için daha fazla alan eklemek isterseniz HABTM tabloları birleştirmek ile bu mümkün olduğunu unutmayın, ancak bu kolay bir seçenek olduğunu anlamak önemlidir.

İki model arasındaki HasAndBelongsToMany bir hasMany ve belongsTo dernek hem aracılığıyla ilişkili üç model için gerçeklik kestirme olduğunu.

Bu örneği ele alalım:

Child hasAndBelongsToMany Club

Bu bakmak için başka bir yolu bir üyelik modeli ekliyor

Child hasMany Membership
Membership belongsTo Child, 
ClubClub hasMany Membership.

Bu iki örnek hemen hemen tam olarak aynıdır. Onlar aynı miktarda ve veritabanı adını alanları ve modelleri aynı miktarda kullanın. Önemli farklar "katılmak" modeli farklı adlandırılmış olduğunu ve bu davranış daha tahmin edilebilir bulunuyor.

Sizin örnekte, diğer kullanıcılara video bağlantıları düzenleme olmadan eklemek ve kaldırmak için bir yol gerekir, bu nedenle standart habtm çok iyi size uygun olmaz. Bu yukarıda açıklanan Üyelik modeline benzer bir "birleştirme" için bir model oluşturun. Eğer bir kilo alan katma Ayrıca, eğer, sen bin başı videoları her set sipariş ordered behavior (I yazdı) kullanabilirsiniz. Sonra aşağıdaki alanları kullanırsınız

id, bin_id, video_id, weight

Ve davranış configuartion de 'foreign_key' olarak bin_id kurmak. İyi şanslar

Peki ben sadece bu sorunu çözmek ve mümkün olan en basit çözüm buldum çalıştı:

Ilgili modellerin yeni bir düzen kaydederken, mevcut ilişkileri silin ve istenilen sırayla yenilerini ekleyebilirsiniz. Bu tür amacıyla çalıştırmak oluşturulan kimlikleri anlamına gelir ve sadece sıralama id sırasını görüntülemek için kullanabilirsiniz.

public $hasAndBelongsToMany = array(
    'Item' => array(
        'order' => 'ItemFoldersItem.id ASC, Item.name DESC',
    )
);

Oldukça basit değil mi?

Ne istediğinizi uygulamak için "en verimli" bir şekilde bilmem, senin bütün uygulamaya bağlıdır ve başarmak istediğinizi. Ben sadece en basit çözüm, genellikle iyi olduğunu akılda tutmak istiyorum.

Ancak, Video diziyi sıralamak için size bir ipucu verebilir! Bu oldukça kolaydır:

$yourData = Set::sort($yourData, '/Video/id', 'asc');

Daha fazla şeker için Set class bir göz atın. :)