2012-04-22 4 views
0

저는 cakephp 2.1.1을 사용하고 있습니다. 이것은 내 테이블 연결입니다 : x hasmany y hasmany z hasmany w.CakePHP 2.1.1. containable behavior not working

모든 것이 제대로 내가 생각하는 설정입니다하지만 난이 쿼리 할 때 :

$conditions = array(
'contain' => array(
'y' => array (
      'z' => array(
       'w'=> array(
        'conditions' => array('col>=' => $q)) 
    ) 
) 
)); 

$this->loadmodel('x'); 
$o=$this->x->find('all',$conditions);//array(
debug($o); 

을 내가 원하는 결과를 해달라고; 테이블 x 만 가져옵니다! 왜?

어쩌면
<? php 

class x extends AppModel 
{ 
    var $name='x'; 
    public $actsAs = array('Containable'); 
    public $hasMany = array('y'); 
} 

CakePHP의 버전 : 예를 들어 이 다른 사람과 유사 나의 모델 X PHP 코드인가? 덕분에 !

정보 :이 같은 진술을 할 :

select z.col1, y.col2, x.col3 
from z, y, x, w 
where w.col>= 3 
and w.z_id = z.id 
and z.y_id = y.id 
and z.x_id = x.id 

답변

1

여기에 꽤 몇 가지 포인트가 있습니다. 비헤이비어가 작동하지 않는 경우

첫째, 아마 아무것도, 모든 것을 다의 이상이 잘되는 가정 내기 아니에요! ;)

나는 당신의 관계 케이크는 당신의 모델을 연결하는 경우 매우 중요 정의 된 외래 키를 가지고 있지 않는 한 당신이 밖으로 많은 양의 코드를 제거했다고 가정합니다.

확실하지가 이런 종류로 loadModel()을 사용하는 이유는 모델 X의 컨트롤러 나 X 모델에서이 작업을 수행해야합니다. 따라서 모델을로드하지 않아도됩니다. 연결이 제대로 작동하면 Contain가 따라갈 때 모델을로드합니다.

예상되는 SQL 문에 관해서는, 불행히도 함유 성이 같은 모델을 가입하지 않고, 몇 가지 모델을 결합합니다,하지만 당신은 hasMany이 경우 추가 데이터를 얻을 수 SELECT 일련의 명령문을 실행 한 다음 모두 함께 참여합니다 .

그것은 또한 당신의 CROSS JOIN 예상보다는 LEFT JOIN 사용합니다. 이것은 Containable 옵션에서 구성 할 수도 있고, 새로운 db 객체를 인스턴스화하고 서브 쿼리를 생성 할 수도 있습니다.

, 당신의 문제로 돌아가려면

  • 내가 먼저 여기에 모델 연결을 확인합니다.
  • 나는 당신이 협회를 제대로 만들고 있는지보기 위해 책을 읽었을 것이다. http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasmany
  • 또한 실제 데이터베이스 스키마가 올바른지 확인합니다. 외래 키는 명명 규칙을 따르거나 모델에 정의되어 있습니다.
  • 내 모델 파일을 백업하고 케이크 콘솔을 cake bake model에 사용하고 구운 모델이 Contain 인지 제대로 확인합니다.

희망이 있으신 분께이 과정을 아직 ​​풀지 않으 셨습니까?