문제

나는 작업에있는 응용 프로그램 데이터에서 수입된 외래(그리고 전체적으로 바꿀 수)source.나는 단순화의 일부 테이블을 설명하는 문제입니다.아래 테이블은 기본 키가 있습니다.

invoices     (doc_number, date_printed, batch_number)
headers      (doc_number, date_printed, batch_number)
deliveries   (doc_number, date_printed, batch_number)
transactions (doc_number, date_printed, batch_number, line_number)
messages     (doc_number, date_printed, batch_number, line_number)

그래서 당신이 볼 수있는 송장,헤더 및 배달이나 관계입니다.송장을 거래 및 송장을 메시지는 많습니다.

에 가져오는 이러한 테이블을 내 자신의 데이터베이스가 변경되었는 기존의 기본 키 독특한 키를 추가 auto_incrementing 분야(id 는)각각의 테이블에 있습니다.

지금 문제는 설정의 관계에서 케이크,지 않기 때문에 정말 처리하는 복합 열쇠다.었을 얻을 수 있나 관계처럼 일하는 이:

class Invoice extends AppModel {
    public $name = "Invoice"
         , $hasOne = array(
            "Header" => array(
                'foreignKey' => false,
                'conditions' => array(
                    "Invoice.doc_number = Header.doc_number",
                    "Invoice.date_printed = Header.date_printed",
                    "Invoice.batch_number = Header.batch_number"
                )
            )
         )
    ;
}

고 이 작품이기 때문에,하나의 관계를 조회 하나에 큰 왼쪽입니다.고 같은 방법으로 하나의 관계에 있는(예를 들어,송장 및 거래)이 죽기 때문에,케이크는 두 개의 쿼리:첫 번째를 찾아 일치하는 모든 청구서,그리고 두번째를 찾는 모든 트랜잭션으로 대응하는 외국인 핵심과 일치하는 결과 첫번째 검색어:(여기에 간단한 쿼리는 그것을 실행하려고)

SELECT `Transaction`.* FROM `transactions` AS `Transaction`
WHERE `Invoice`.`doc_number` = `Transaction`.`doc_number`
AND `Invoice`.`date_printed` = `Transaction`.`date_printed`
AND `Invoice`.`batch_number` = `Transaction`.`batch_number`

당신이 볼 수있는,그것의 가입하지로 송장이 그래서 쿼리 죽습니다.

에 대해 어떤 생각을 어떻게 만들 수 있습니다 이 작품은?

도움이 되었습니까?

해결책

최악의 경우,사용할 수 있습니다 finderQuery 의 매개변수 hasMany 관계.그것은 당신을 완전히 무시 쿼리를 처리합니다.

할 수도 있습니다 추가 고유 id 필드를 결합하는 관련 데이터 필드를 하나입니다.업데이트 문을 해결할 수 있는 기존 데이터 및 트리거 될 수 있는 설정을 업데이트 새로운 기록으로 추가하거나 변경 가정하면,데이터베이스를 지원합 트리거합니다.

편집: 의 모든 다른 복잡성,좋을 수도 있습 건너뛰 hasMany 관계를 모두 가져오는 트랜잭션 기록 별도의 찾을 수 있습니다().당신이해야 할 경우가 매우 많은 장소 당신은 항상 수 있는 포장에 함수에서 청구 모델 이 같은:

<?php
class Invoice extends AppModel() {
    ...

    function getInvoice($conditions) {
        $invoice = $this->find('first', compact('conditions'));

        $conditions = array(
             'Transaction.doc_number' => $invoice['Invoice']['doc_number'],
             'Transaction.date_printed' => $invoice['Invoice']['date_printed'],
             'Transaction.batch_number' => $invoice['Invoice']['batch_number']);
        $invoice['transactions'] = $this->Transaction->find('all', compact('conditions'));

        return $invoice;
    }
}
?>

는 경우 다음과 같은 함수를 사용하는 모델에는 것을 잊지 않는 송장이 필요 정의된 관계는 트랜잭션에도를 사용하지 않는 경우에 그것은 바로,그래서 그$이>트랜잭션이 정의됩니다.

또한,당신이 선호하는 경우에 데이터를 반환되는 방법 hasMany 관계 것,항상 추가할 수 있습 foreach 루프를 재결합시키는 방법입니다.

업데이트SimpleResults 동작에서 케이크 빵집 할 수 있는 쉽게 돌아온 그 결과는 다른 테이블 형식의 정규 hasMany association.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top