0

これが私のデータベーススキーマです:

create table Personas
(
    id int primary key AUTO_INCREMENT,
    Nombre varchar(255),
    Apellidos varchar(255),
    FechaDeNacimiento date,
    Sexo Bool,
    CarnetDeIdentidad varchar(255)
);

create table Tutors
(
    id int primary key AUTO_INCREMENT,
    persona_id int,
    FOREIGN KEY (persona_id) REFERENCES Personas(id)
);

create table Alumnos
(
    id int primary key AUTO_INCREMENT,
    persona_id int,
    FOREIGN KEY (persona_id) REFERENCES Personas(id)
);

create table CoordinadorDeProgramas
(
    id int primary key AUTO_INCREMENT,
    persona_id int,
    FOREIGN KEY (persona_id) REFERENCES Personas(id)
);

そして、これが私のモデル宣言です:

<?php
class Alumno extends AppModel {
    public $belongsTo = 'Persona';
}

<?php
class Coordinadordeprograma extends AppModel {
    public $belongsTo = 'Persona';
}

<?php
class Tutor extends AppModel {
    public $belongsTo = 'Persona';
}

<?php
class Persona extends AppModel {
    public $hasOne = array('Alumno', 'Tutor', 'Coordinadordeprograma');
}

私のコントローラーでは、(たとえば)Alumnosで外部キー関係がある場合、すべてのPersonaレコードをフェッチしたいだけです。

これが私のコードです。私がやろうとしていることを示しているといいのですが。

public function filter($type = null) {
    if ($type == "alumno") { // www.app.com/personas/filter/alumno
        $this->set('personas', $this->Alumno->Persona->find('all'));
    }
}

ただし、これは、Alumnoテーブルにレコードがあるレコードだけでなく、すべてのPersonaレコードを返します。

この問題を解決するためにどのように提案しますか?使う$this->Alumno->Personaことで、アルムノのテーブルにいるペルソナにしか届かないと思いました。

ありがとう!

4

2 に答える 2

1

INNER JOIN 次のように、オンザフライで作成を試すことができます。

$personas = $this->Alumno->Persona->find('all', array(
    'joins' => array(
        array(
            'table' => 'Alumnos',
            'alias' => 'Alumno',
            'type' => 'INNER',
            'conditions' => 'Persona.id = Alumno.persona_id'
        )
    )
));

$this->set('personas', $personas);
于 2012-10-04T15:57:15.897 に答える
1

封じ込め可能な動作を使用して、 Alumno??を検索することができます。

$this->set('personas', $this->Alumno->find('all'));

すべてのモデルが関連付けられた「Alumno」を取得する必要があります。取得するモデルを選択することもできます。たとえば、このコードは、すべての「Alumno」とそれに対応する「Persona」を取得します

$this->set('personas', $this->Alumno->find('all',array('contain'=>array('Persona')));

もちろん..@Pauloが答えたように、手動で結合することもできますが、「containable」を使用する方がクリーンです。他に解決策がない場合にのみ、手動で結合します。

お役に立てれば、

于 2012-10-05T08:22:51.813 に答える