CakePHP ilişkili bir tablodan alınan satır sayısını sınırlamak için?

3 Cevap php

İki veritabanı tabloları varsayarsak: Funds ve Prices ki Funds hasMany Prices.

Ne yapmak istediğini belli bir senaryoda, belirli bir fonun son 15 fiyatlarını almak için. Bana ilişkili Price tablodan alınacak satır sayısını sınırlamak için izin verecek bir $this->Fund->find('all') arama yapmak için CakePKP'deki bir anlamı var mı?

Fund modelin $hasMany değişkene Note that I prefer not setting the 'limit' seçeneğini.

Note on accepted answer [Nov 2]:

Ben bir tek-off kılma yapmak gibi "hack-y", benimle daha iyi gidişatı biraz duygu rağmen keçe gibi In Jason's answer which I had accepted, ben şahsen bindModel çözüm için tercih Varsayılan Model bağlamaları.

Ben aşağıdaki gibi kullanılan kod:

$this->Fund->bindModel(array(
    'hasMany' => array(
        'Price' => array(
            'limit' => 15,
            'order' => 'Price.date DESC'
        )
    )
);

No unbindModel gereklidir. Daha fazla bilgi CakePHP kılavuzda “3.7.6.6 Creating and Destroying Associations on the Fly” okunabilmektedir.

3 Cevap

Ben soruyu anlamak gibi, modelde statik sınırını ayarlamak istemiyorum. Bir hasMany dernek kullanmak istiyorsanız, gerçekten ben bu limiti, bir yol veya başka dışında değişen farkındayım başka bir yolu yoktur.

İşte dinamik olarak değiştirmek için bir kaç yolu vardır:

  1. Sen Fonlar-> BindModel () çağrısı ile sınırını değiştirebilir. (Bu ilk () bir unbindModel gerekebilir, ama ben kesin hatırlayamıyorum)
  2. Doğrudan sınırını değiştirmek için Fonlar için bir işlev eklemek olabilir. (Aşağıdaki örneğe bakınız.)
  3. Eğer iddialı hissettiğiniz, size () the Containable behavior benzer aramak bulmak başına bunu belirtmek için işlevsellik eklemek için bir Davranış yazabilirsiniz.

Example for #2

<?php
function setPriceLimit($limit = 10) {
     // Assuming the association is 'Price'
     $this->hasMany['Price']['limit'] = $limit;
}
?>

Kolayca Bunu gerçekleştirmek için Containable davranışları kullanabilirsiniz.

  • Lütfen AppModel veya Fon modeli add in:

    var $actsAs = array('Containable');
  • sonra denetleyicisi size find ('all') için 'içeren' seçeneğini ekleyebilirsiniz:

    $this->Fund->find('all', array(
        'contain' => array(
            'Price' => array(
                'limit' => 15,
                'order' => 'Price.date DESC')
    )));
    

Daha fazla bilgi kitapta mevcuttur: http://book.cakephp.org/view/474/Containable

Sizin $ this-> Model-> ('all') bulmak koşullarını içerebilir. yani.

$ This-> Model-> find ('all', array ('koşullar' => array ('Model.field' => $ değer), 'sınır' => 15));

Daha fazla bilgi için pasta belgeleri kontrol.

Retrieving Your Data