mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2025-02-12 06:56:24 +00:00
Fixing autoFields causing invalid SQL when cross database joins are being done. Tests added. Fixes #476
This commit is contained in:
parent
2f0255ec1a
commit
029d2581af
2 changed files with 45 additions and 3 deletions
|
@ -187,7 +187,7 @@ class ContainableBehavior extends ModelBehavior {
|
||||||
foreach (array('hasOne', 'belongsTo') as $type) {
|
foreach (array('hasOne', 'belongsTo') as $type) {
|
||||||
if (!empty($Model->{$type})) {
|
if (!empty($Model->{$type})) {
|
||||||
foreach ($Model->{$type} as $assoc => $data) {
|
foreach ($Model->{$type} as $assoc => $data) {
|
||||||
if (!empty($data['fields'])) {
|
if ($Model->useDbConfig == $Model->{$assoc}->useDbConfig && !empty($data['fields'])) {
|
||||||
foreach ((array) $data['fields'] as $field) {
|
foreach ((array) $data['fields'] as $field) {
|
||||||
$query['fields'][] = (strpos($field, '.') === false ? $assoc . '.' : '') . $field;
|
$query['fields'][] = (strpos($field, '.') === false ? $assoc . '.' : '') . $field;
|
||||||
}
|
}
|
||||||
|
@ -195,17 +195,26 @@ class ContainableBehavior extends ModelBehavior {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($mandatory[$Model->alias])) {
|
if (!empty($mandatory[$Model->alias])) {
|
||||||
foreach ($mandatory[$Model->alias] as $field) {
|
foreach ($mandatory[$Model->alias] as $field) {
|
||||||
if ($field == '--primaryKey--') {
|
if ($field == '--primaryKey--') {
|
||||||
$field = $Model->primaryKey;
|
$field = $Model->primaryKey;
|
||||||
} else if (preg_match('/^.+\.\-\-[^-]+\-\-$/', $field)) {
|
} else if (preg_match('/^.+\.\-\-[^-]+\-\-$/', $field)) {
|
||||||
list($modelName, $field) = explode('.', $field);
|
list($modelName, $field) = explode('.', $field);
|
||||||
$field = $modelName . '.' . (($field === '--primaryKey--') ? $Model->$modelName->primaryKey : $field);
|
if ($Model->useDbConfig == $Model->{$modelName}->useDbConfig) {
|
||||||
|
$field = $modelName . '.' . (
|
||||||
|
($field === '--primaryKey--') ? $Model->$modelName->primaryKey : $field
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$field = null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if ($field !== null) {
|
||||||
$query['fields'][] = $field;
|
$query['fields'][] = $field;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
$query['fields'] = array_unique($query['fields']);
|
$query['fields'] = array_unique($query['fields']);
|
||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3593,6 +3593,39 @@ class ContainableBehaviorTest extends CakeTestCase {
|
||||||
$this->assertEqual($expected, $this->Article->hasAndBelongsToMany);
|
$this->assertEqual($expected, $this->Article->hasAndBelongsToMany);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test that autoFields doesn't splice in fields from other databases.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function testAutoFieldsWithMultipleDatabases() {
|
||||||
|
$config = new DATABASE_CONFIG();
|
||||||
|
|
||||||
|
$skip = $this->skipIf(
|
||||||
|
!isset($config->test) || !isset($config->test2),
|
||||||
|
'%s Primary and secondary test databases not configured, skipping cross-database '
|
||||||
|
.'join tests.'
|
||||||
|
.' To run these tests, you must define $test and $test2 in your database configuration.'
|
||||||
|
);
|
||||||
|
if ($skip) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$db =& ConnectionManager::getDataSource('test2');
|
||||||
|
$this->_fixtures[$this->_fixtureClassMap['User']]->create($db);
|
||||||
|
$this->_fixtures[$this->_fixtureClassMap['User']]->insert($db);
|
||||||
|
|
||||||
|
$this->Article->User->setDataSource('test2');
|
||||||
|
|
||||||
|
$result = $this->Article->find('all', array(
|
||||||
|
'fields' => array('Article.title'),
|
||||||
|
'contain' => array('User')
|
||||||
|
));
|
||||||
|
$this->assertTrue(isset($result[0]['Article']));
|
||||||
|
$this->assertTrue(isset($result[0]['User']));
|
||||||
|
|
||||||
|
$this->_fixtures[$this->_fixtureClassMap['User']]->drop($db);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* containments method
|
* containments method
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue