2013-02-28 34 views
0

我正在使用现有数据库(我无法更改它,并且它的表名不像蛋糕约定想要的那样),并且我想要做一些左加入但不能正确地做到这一点:/Cakephp:与非常规表的左右连接

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

这里是我的问题:

表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 JOIN或右连接,但不管怎么说问题是一样的,这个代码给了我与同系的多次出现不好的答案:/

感谢:/

PS:对不起,我的英语不好,这不是我的母语语言翻译年龄。

回答

0

无法在同一个查询中加入wp_id上的内容和菜单表,因为它们都与wp_id具有多对一关系,并且对于内容中的每一行而言,存在具有相同wp_id的菜单中的所有行,结果为这样的加入。你需要做2个查询:一个用于内容,一个用于菜单。或者,如果列表列需要两个表相同,则可以将这两个查询的结果合并。