如何在cakephp中正确构建这个mysql连接查询?

时间:2018-04-27 13:58:04

标签: php mysql cakephp

首先,版本: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”)。

1 个答案:

答案 0 :(得分:-1)

所以,为了回答我自己的问题,我完全避开了cakephp。

我的解决方案是在我的模型中创建一个直接执行查询的函数。这是有效的,因为我已经有了精确的mysql语法,并且在这种情况下使用cakephp被证明太混乱了。

这个替代问答提供了对我的问题的洞察:SO Question

我本来希望用cakephp的引擎生成这个join语句,但也许我的cakephp版本太旧了,或者我对框架还不够了解。

干杯。