1

それぞれのモデルの関連付けはすべて、私の側で正しく構成されています。

外部キーの関連付けを簡単に確認できるように、データベース SQL スクリプトを次に示します。

create table proveedors 
(
    id int primary key AUTO_INCREMENT,
    nombre varchar(256)
);

create table libros 
(
    id int primary key AUTO_INCREMENT,
    proveedor_id int,
    FOREIGN KEY (proveedor_id) REFERENCES proveedors(id),
    titulo varchar(1024),
    autor varchar(512)
);

create table materias 
(
    id int primary key AUTO_INCREMENT,
    nombre varchar(1024),
    version varchar(8)
);

create table libros_materias
(
    id int primary key AUTO_INCREMENT,
    materia_id int,
    FOREIGN KEY (materia_id) REFERENCES materias(id),
    libro_id int,
    FOREIGN KEY (libro_id) REFERENCES libros(id)
);

これが私が実行しているクエリです:

# Buscar todos los libros asociados a esta materia.
$libros = $this->LibrosMateria->findAllByMateriaId($id);
$this->set('libros', $libros);

現在、期待どおりにすべてのデータを正しくフェッチしています。クエリをもう 1 つ少しホップさせて、Proveedor's name.

現在のクエリはこれを返しています:

(int) 0 => array(
    'LibrosMateria' => array(
        'id' => '2',
        'materia_id' => '1',
        'libro_id' => '1'
    ),
    'Materia' => array(
        'id' => '1',
        'tipo_materia_id' => '1',
        'sigla' => 'MKT-111',
        'nombre' => 'Direccion de Marketing',
        'version' => '3-2012'
    ),
    'Libro' => array(
        'id' => '1',
        'proveedor_id' => '1',
        'titulo' => 'PHP 2.0',
        'autor' => 'Arhari',
        'edicion' => '3ra Edicion',
        'isbn' => '0912309',
        'cantidad_de_paginas' => '912',
        'fecha_de_publicacion' => '2012-10-08',
        'portada' => null
    )
),

1 つの外部キー ホップを作成していることがわかりますが、それ以上は進んでいません。CakePHP でこれを行う方法はありますか? 助言がありますか?注意:モデルの関連付けは正しく設定されています。

4

2 に答える 2

2

クエリを次の場所から変更してみてください。

$libros = $this->LibrosMateria->findAllByMateriaId($id);

に:

$libros = $this->LibrosMateria->findAllByMateriaId($id, array(), array(), null, null, 2);

ここでは、$ recursiveフィールドを2に設定しています。これにより、必要な情報が取得されます。

詳細については、 http://book.cakephp.org/2.0/en/models/retrieveing-your-data.html#findallbyを参照してください。

于 2012-10-31T15:24:12.860 に答える
1

CakePHP の Containable 動作を使用します。

LibrosMateria モデル (または AppModel をすべてのモデルのデフォルトとして設定する) で:

public $recursive = -1; 
public $actsAs = array('Contaniable');

次に、これを検索に使用します。

$this->LibrosMateria->find('all', array(
    'contain' => array(
        'Materia',
        'Libro' => array(
            'Proveedor'
        )
    )
));

これにより、各テーブルのフィールド、制限、条件など、必要な情報を正確に指定できます。

今のところ、 を使用して同様の結果が得られる可能性がありますが$recursive=2、これは悪い考えであり、アプリが成長するにつれて多くの問題が発生します。実際に必要なデータや必要なデータを気にせずに、やみくもにデータを取得します。これで私を信頼してください。再帰は存在すべきではないということが今ではかなり受け入れられており、将来の CakePHP のバージョンでは、この考えは完全に取り除かれていると私は信じています。代わりに Containable を使用してください。

于 2012-10-31T18:01:16.327 に答える