1'den fazla düzeyde CakePHP sipariş sorgusu sonuçları

5 Cevap php

Ben Yorumlar (; Soru hasMany Post ve Post hasMany görmediniz, tüm bu Kullanıcılara ait Soru aittir belongsTo post) bir listesini almak için Containable davranışları kullanıyorum.

$data = $this->Question->find ( 'first', 
    array ('contain' => 
        array ('User', 
               'Post' => array ('User', /* 'order' => 'User.created DESC'*/ )
        ) 
    ) 
);

Yukarıdaki açıklamalarda bölümünü yorum zaman, çalışır. Ben bu beklenen budur herhalde, ama ne istediğinizi bulunur ki Mesajlar, onlar ait 'Kullanıcı' ve 'yaratılan' alanına sırasına göre sıralanır gerektiğidir. Nasıl CakePHP'de sıralama bu daha derin bir seviyede gerçekleştirmek mi? Ben her zaman "'sipariş fıkrasında' Bilinmeyen sütun 'User.created': SQL Error: 1054 (512) uyarısı", olsun

Yardımlarınız için teşekkürler!

5 Cevap

Ayrıca, birleştirmeler kullanmayan bir buluntu çağrısından ilgili bir masada grup çalışıyor olabilirsiniz.

1'den büyük bir şey için hata ayıklama seviyesini ayarlayın böylece sorgu günlüğünü görmek ve Kek veri almak için iki sorgu yapmıyor emin olabilirsiniz. Bu durumda o ilk sorgu aslında ikinci tabloya başvuran değildir.

Elle zorlamak istiyorsanız size Ad-Hoc aşağıdaki linkten Nate tarafından özetlenen yöntemi katılır kullanabilirsiniz bu durumlarda katılmak.

http://bakery.cakephp.org/articles/view/quick-tip-doing-ad-hoc-joins-in-model-find

Lütfen özyinelemeli değerini kontrol edin. Bu çok sınırlayıcı eğer, bu, IIRC containable bağlantıları gözardı edecektir. Ben bu işe birkaç kez darbeleme hatırlıyorum. Birden modelleri içeren denemek istiyorum, ama benim recursive seçeneği 0 için kuruldu ve bir şey çekti olacaktı. Lütfen Örneğin, 1 (varsayılan) bir değer yeterli olacağını düşünmek istiyorum, ama belki açıkça 0 yere onu kurdum?

Bulmak için çağrı önce ekleyebilirsiniz () aşağıdaki gibidir:

 $this->Question->order = 'Question.created DESC';

I have found two ways to get around this. The first is to define the second level associacion directly in the model. Now you will have access to this data everywhere. It should look something like this.....

var $belongsTo = array(
'Foo' => array(
  'className' => 'Foo', //unique name of 1st level join ( Model Name )
  'foreignKey' => 'foo_id', //key to use for join
  'conditions' => '',
  'fields' => '',
  'order' => ''
),
'Bar' => array(
  'className' => 'Bar', //name of 2nd level join ( Model Name )
  'foreignKey' => false,
  'conditions' => array(
    'Bar.id = Foo.bar_id' //id of 2nd lvl table = associated column in 1st level join
  ),
  'fields' => '',
  'order' => ''
)
);

The problem with this method is that it could make general queries more complex than they need be. You can thus also add the second level queries directly into te find or paginate statement as follows: (Note: I found that for some reason you can't use the $belongsTo associations in the second level joins and will need to redefine them if they are already defined. eg if 'Foo' is already defined in $belongsTo, you need to create a duplicate 'Foo1' to make the association work, like the example below.)

$options['joins'] = array(

array('table' => 'foos',
  'alias' => 'Foo1',
  'type' => 'inner',
  'conditions' => array(
    'CurrentModel.foo_id = Foo1.id'
  )
),
array('table' => 'bars',
  'alias' => 'Bar',
  'type' => 'inner',
  'foreignKey' => false,
  'conditions' => array(
    'Bar.id = Foo1.bar_id'
  )
)
);

$options['conditions'] = array('Bar.column' => "value");
$this->paginate = $options;
$[modelname] = $this->paginate();
$this->set(compact('[modelname]'));

Bunu anlamak için yeterince açıktır ve birisi yardımcı olacağını umuyorum.

Evet, ben ilgili / ilişkili modeline göre sıralamak nasıl çalışır, yani Set::sort() yöntemini kullanarak sona erdi olamazdı. this article iyi bir açıklama için çıkış.

// This finds all FAQ articles sorted by:
// Category.sortorder, then Category.id, then Faq.displaying_order
$faqs = $this->Faq->find('all', array('order' => 'displaying_order'));
$faqs = Set::sort($faqs, '{n}.Category.id', 'ASC');
$faqs = Set::sort($faqs, '{n}.Category.sortorder', 'ASC');

... Ve evet, muhtemelen bir Category->find() olmalı ama ne yazık ki orijinal geliştirici bu şekilde kod vermedi ve ben görüşlerini yeniden işleme istemedim.