Как правильно построить этот запрос на присоединение к MySQL в CakePHP? - PullRequest
0 голосов
/ 27 апреля 2018

Прежде всего, версии: 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. Я обычно не задаю вопросы, но соединения - проклятие моего существования. Я понимаю их, но создавать их в новых рамках утомительно.

Дополнительный полезный URL: Диаграмма операторов объединения, для заинтересованных.

Редактировать 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: Название моего первого объекта модели было неправильным, если сравнивать с «а». На самом деле это «аа», а также переменная имени внутри него. То же самое относится и к объекту модели b (теперь он помечен как «bb»).

1 Ответ

0 голосов
/ 27 апреля 2018

Итак, чтобы ответить на свой вопрос, я полностью избежал CakePHP.

Мое решение состояло в том, чтобы создать функцию внутри моей модели, которая выполняет запрос напрямую. Это работает, потому что у меня уже есть точный синтаксис mysql, и работа с cakephp оказывается слишком запутанной в этом случае.

Этот альтернативный вопрос и ответ дал представление о моей проблеме: SO Вопрос

Мне бы хотелось использовать движок cakephp для генерации этого оператора соединения, но, возможно, моя версия cakephp слишком устарела, или, может быть, я пока недостаточно разбираюсь в фреймворке.

Приветствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...