我正在使用一个现有的数据库(我不能改变它,它的表名不像蛋糕惯例那样),我想做一些左连接,但不能正确地做到:/ < / p>
我已经定义了我的表,给它们主键和模型中的关系。
这是我的问题:
表Wysipage可以是0到n wysipage_content
,0到n wysipage_menu
。
来自wysipage_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
就是这样:(
我甚至不确定我想要LEFT加入还是RIGHT加入,但无论如何问题仍然是相同的,这段代码给出了多次出现相同行的错误答案:/
谢谢:/
PS:对不起我的英语不好,这不是我的母语。
答案 0 :(得分:0)
你不能在同一个查询中连接wp_id上的内容和菜单表,因为它们都与wp_id有多对一的关系,而且内容中的每一行都有来自菜单的所有行,其结果是wp_id加入。您需要执行2个查询:一个用于内容,一个用于菜单。或者,如果两个表所需的列表列相同,则可以将这两个查询的两个结果合并。