0

我正在使用现有的数据库(我无法更改它,并且它的表名不像蛋糕约定想要的那样),我想做一些左连接但不能正确执行:/

我已经定义了我的表,为它们提供了主键和模型中的关系。

这是我的问题:

表 Wysipage 可以有 0 到 nwysipage_content和 0 到 n wysipage_menu。一个元素 fromwysipage_content对应于 1 且只有 1 个 Wysipage。来自的元素wysipage_menu对应于 0 或 1 个 Wysipage。

我想提出一个请求,他会给我一份来自 Wysipages 的所有元素的列表,以及它们最终的内容和菜单,所有这些都在一个表中,并且只有一个请求。

这是我的表定义(我避免使用整个架构,请注意有一个wp_id和一个wp_name列):

class Wysipage extends AppModel {
var $actsAs = array('Containable');
    public $useTable = 'wysipage'; 
public $primaryKey = 'wp_id';
public $displayField = 'wp_name';
var $hasMany = array(
'un' => array(
    'Wysipage_contenu' => array(
        'className'     => 'Wysipage_contenu',
        'foreignKey'    => 'wpc_wp_id',
    )),
'deux' => array(
    'Wysipage_menu' => array(
        'className'     => 'Wysipage_menu',
        'foreignKey'    => 'wpm_wp_id',
    ))
);


class Wysipage_contenu extends AppModel {
var $actsAs = array('Containable');
    public $useTable = 'wysipage_contenu'; 
public $primaryKey = 'wpc_id';
public $displayField = 'wpc_h1';
public $belongsTo = array(
        'Wysipage' => array(
            'className'    => 'Wysipage',
            'foreignKey'    => 'wp_id'
        )
);

class Wysipage_menu extends AppModel {
var $actsAs = array('Containable');
public $useTable = 'wysipage_menu'; 
public $primaryKey = 'wm_id';
public $displayField = 'wm_lien';
public $belongsTo = array(
        'Wysipage' => array(
            'className'    => 'Wysipage',
            'foreignKey'    => 'wm_wp_id'
        )
);

这是我尝试请求的代码(但失败):

$this->loadModel('Wysipage_contenu');
    $this->loadModel('Wysipage_menu');

    $this->Wysipage->contain();
    $mes_wysipages = $this->Wysipage->find('all', array('joins' => array(
        array(
            'table' => 'wysipage_contenu',
            'alias' => 'wpc',
            'type' => 'LEFT',
            'conditions'=> array('wpc.wpc_wp_id = Wysipage.wp_id')
        ),
        array(
            'table' => 'wysipage_menu',
            'alias' => 'wpm',
            'type' => 'LEFT',
            'conditions'=> array('wpm.wm_wp_id = Wysipage.wp_id')
        )
    )));

    $this->set('wysipages', $mes_wysipages);
    $this->render();

我做错了什么?我的模型声明中有问题吗?还是我使用了错误的请求类型?:(

我想提出的要求很简单:

SELECT wp_id, wp_name, wpc_id, wpc_name
FROM wysipage
LEFT JOIN wysipage_contenu ON wysipage.wp_id = wysipage_contenu.wpc_wp_id

只是这个 :(

我什至不确定我想要左连接还是右连接,但无论如何问题仍然存在,这段代码给了我错误的答案,多次出现相同的行:/

谢谢 :/

PS:对不起我的英语不好,这不是我的母语。

4

1 回答 1

0

您不能在同一查询中连接 wp_id 上的内容和菜单表,因为它们都与 wp_id 具有多对一关系,并且对于内容中的每一行,在这种连接的结果中,菜单中的所有行都具有相同的 wp_id。您需要进行 2 次查询:一次查询内容,一次查询菜单。或者,如果列出两个表需要相同的列,则可以合并这两个查询的两个结果。

于 2013-02-28T15:53:26.790 回答