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);

现在它正在按预期正确获取所有数据;我只需要让查询多跳一点,然后让我得到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/retrieving-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 版本中,我相信他们会完全消除这个想法。请改用可包含的。

于 2012-10-31T18:01:16.327 回答