首先,版本:cakephp - > 1.3.15,MySql - > 5.5.38,php - > 5.5.9-1ubuntu4.4(从phpversion()输出)。
注意:我正在切换通用名称的表名和值。也许这会在我写这篇文章时有助于我自己的理解,我希望读者能够清楚这一点。
查询我想要达到:
SELECT `a`.*
FROM `a`
INNER JOIN b
ON `a`.`foreign_key_non_unique_id` = 10
AND `b`.`email` = 'test@test.com'
LIMIT 1
Cakephp代码我有:
$table_a_row= $this->a->find('first',
array('conditions' => array(
'a.foreign_key_non_unique_id' =>
$foreign_key_non_unique_id_var['foreign_key_table']['id'],
'bb.email' =>
$value['askerEmail']),
'joins' => array(
'table' => 'b',
'alias' => 'bb',
'type' => 'inner',
'conditions' => 'bb.id = a.b_foreign_key_id')));
查询cakephp吐出:
SELECT `aa`.*
FROM `a` AS `aa` b bb
inner bb.id = aa.b_foreign_key_id
WHERE `aa`.`foreign_key_non_unique_id` = 10
AND `bb`.`email` = 'test@test.com'
LIMIT 1
PS。我通常不会问问题,但加入是我存在的祸根。我了解它们,但在新框架内创建它们很烦人。
其他有用的网址:Diagram加入声明,供感兴趣的人使用。
编辑1: 我的模型与此问题的定义如下:
class aa extends AppModel {
var $name = 'aa';
var $useDbConfig = 'db';
var $recursive = 1;
var $validate = array(
'foreign_key_non_unique_id_var' => (
'notempty' => array(
'rule' => array('notempty'),
'message' => 'Foreign Key Id: This is a required field'
)
),
'b_foreign_key_id' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'B Foreign Key Id: This is a required field'
)
)
var $belongsTo = array(
//foreign_key_non_unique_id_var table
'Table' => array(
'className' => 'Table',
'foreignKey' => 'table_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
)
var $hasMany = array(
//unrelated tables
);
}
class bb extends AppModel {
var $name = 'bb';
var $useDbConfig = 'db';
var $primaryKey = 'id';
}
另外,在cakephp查询代码之前,我有这个:
$this->a->recursive = -1;
编辑2: 与“a”相比,我的第一个模型对象的标题是错误的。它实际上是“aa”,以及其中的name变量。模型对象b也是如此(现在正确标记为“bb”)。
答案 0 :(得分:-1)
所以,为了回答我自己的问题,我完全避开了cakephp。
我的解决方案是在我的模型中创建一个直接执行查询的函数。这是有效的,因为我已经有了精确的mysql语法,并且在这种情况下使用cakephp被证明太混乱了。
这个替代问答提供了对我的问题的洞察:SO Question
我本来希望用cakephp的引擎生成这个join语句,但也许我的cakephp版本太旧了,或者我对框架还不够了解。
干杯。