CakePHP 3. seviye ilişkisine dayalı veri sorgulama

4 Cevap php

Ben aşağıdaki ilişkiler kurdunuz:

A HABTM B
B belongsTo C
C hasMany B

Şimdi, verilen bir A için, ben B ekli tüm C gerek. Ben SQL sorguları yazabilirsiniz, ama doğru CakePHP yolu nedir? Hangi yöntem ben hangi model üzerinde, ve hangi parametreler ile diyorsunuz?

4 Cevap

Ben Aziz'in 'cevabı ile gitmek ve size rağmen sizin birincil model olarak C gerekiyorsa, küçük bir çözüm yapmak zorunda olacak içeri gelir olarak sadece verileri işlemek istiyorum. Kek özellikle sorguların kaldırılan 3 kuzenleri tür, henüz ilgili modellerde koşulları ile müthiş iyi değil. Genellikle sadece fiili belongsTo veya hasMany ilişkilerine sorguları JOIN gelmez; değil HABTM ilişkilerine rağmen, bu ayrı sorgularda alır bu. Yani ilgili HABTM modellerde koşulları içerir anlamına gelir.

Yapabileceğiniz en iyi şey o zaman böyle bir şey olabilir:

// get related records as usual with the condition on A, limit to as little data as necessary
$ids = $this->A->find('first', array(
    'conditions' => array('A.id' => 'something'), 
    'recursive'  => 2,
    'fields'     => array('A.id'),
    'contain'    => array('B.id', 'B.c_id', 'B.C.id') // not quite sure if B.C.id works, maybe go with B.C instead
));

// find Cs, using the ids we got before as the condition
$Cs = $this->C->find('all', array(
    'conditions' => array('C.id' => Set::extract('/B/C/id', $ids)),
    'recursive   => 1
);

Bu sorguları oldukça bir demet üretir, bu yüzden gerçekten iyi bir çözüm olmadığını unutmayın. Kendi SQL Yazma aslında temiz yolu olabilir.

EDIT:

Alternatif olarak, re-bind your associations on the fly yapmak olabilir onları hasMany / belongsTo ilişkiler, büyük olasılıkla daha kolay ilgili modellerde koşulları kullanmak için etkinleştirmek, ama hala zor bulunuyor olabilir A ve B katılmak tablo / modelini kullanarak koşul A. açıkken Cs getir

$this->A->find(
   'first', 
   array('conditions'=>array('id'=>'someword'), 
   'recursive'=>2)
);

Bu gibi mi?

Bu işe yarayabilir

$this->C->find('all',
array('conditions'=>array('id'=>'someword','B.aid'=>$a.id)));

Ben (http://book.cakephp.org/view/474/Containable) ... ilgili veri bulma ile ilgili bir çok kontrol sağlar "Containable" davranış düşünmek istiyorum.