Прежде всего, версии: 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»).