Cakephp:左右连接非常规表

时间:2013-02-28 14:54:54

标签: php database cakephp left-join

我正在使用一个现有的数据库(我不能改变它,它的表名不像蛋糕惯例那样),我想做一些左连接,但不能正确地做到:/ < / p>

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

这是我的问题:

表Wysipage可以是0到n wysipage_content,0到n wysipage_menu。 来自wysipage_content的元素对应于1且仅有1个Wysipage。 来自wysipage_menu的元素对应于0或1 Wysipage。

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

以下是我的表格定义(我要避开整个架构,只要知道有wp_idwp_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

就是这样:(

我甚至不确定我想要LEFT加入还是RIGHT加入,但无论如何问题仍然是相同的,这段代码给出了多次出现相同行的错误答案:/

谢谢:/

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

1 个答案:

答案 0 :(得分:0)

你不能在同一个查询中连接wp_id上的内容和菜单表,因为它们都与wp_id有多对一的关系,而且内容中的每一行都有来自菜单的所有行,其结果是wp_id加入。您需要执行2个查询:一个用于内容,一个用于菜单。或者,如果两个表所需的列表列相同,则可以将这两个查询的两个结果合并。