mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2025-01-31 09:06:17 +00:00
Making habtm join conditions used by __saveMulti when finding link records to remove. It should be noted that having conditions on non-joinTable tables, and not having a model on the joinTable can cause SQL issues. Fixes #304
This commit is contained in:
parent
6c3bcdd7e6
commit
2e0acbf505
2 changed files with 59 additions and 9 deletions
|
@ -1302,14 +1302,6 @@ class Model extends Overloadable {
|
||||||
if (isset($this->hasAndBelongsToMany[$assoc])) {
|
if (isset($this->hasAndBelongsToMany[$assoc])) {
|
||||||
list($join) = $this->joinModel($this->hasAndBelongsToMany[$assoc]['with']);
|
list($join) = $this->joinModel($this->hasAndBelongsToMany[$assoc]['with']);
|
||||||
|
|
||||||
$conditions = array($join . '.' . $this->hasAndBelongsToMany[$assoc]['foreignKey'] => $id);
|
|
||||||
|
|
||||||
$links = $this->{$join}->find('all', array(
|
|
||||||
'conditions' => $conditions,
|
|
||||||
'recursive' => -1,
|
|
||||||
'fields' => $this->hasAndBelongsToMany[$assoc]['associationForeignKey']
|
|
||||||
));
|
|
||||||
|
|
||||||
$isUUID = !empty($this->{$join}->primaryKey) && (
|
$isUUID = !empty($this->{$join}->primaryKey) && (
|
||||||
$this->{$join}->_schema[$this->{$join}->primaryKey]['length'] == 36 && (
|
$this->{$join}->_schema[$this->{$join}->primaryKey]['length'] == 36 && (
|
||||||
$this->{$join}->_schema[$this->{$join}->primaryKey]['type'] === 'string' ||
|
$this->{$join}->_schema[$this->{$join}->primaryKey]['type'] === 'string' ||
|
||||||
|
@ -1351,6 +1343,16 @@ class Model extends Overloadable {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->hasAndBelongsToMany[$assoc]['unique']) {
|
if ($this->hasAndBelongsToMany[$assoc]['unique']) {
|
||||||
|
$conditions = array_merge(
|
||||||
|
array($join . '.' . $this->hasAndBelongsToMany[$assoc]['foreignKey'] => $id),
|
||||||
|
(array)$this->hasAndBelongsToMany[$assoc]['conditions']
|
||||||
|
);
|
||||||
|
$links = $this->{$join}->find('all', array(
|
||||||
|
'conditions' => $conditions,
|
||||||
|
'recursive' => empty($this->hasAndBelongsToMany[$assoc]['conditions']) ? -1 : 0,
|
||||||
|
'fields' => $this->hasAndBelongsToMany[$assoc]['associationForeignKey']
|
||||||
|
));
|
||||||
|
|
||||||
$associationForeignKey = "{$join}." . $this->hasAndBelongsToMany[$assoc]['associationForeignKey'];
|
$associationForeignKey = "{$join}." . $this->hasAndBelongsToMany[$assoc]['associationForeignKey'];
|
||||||
$oldLinks = Set::extract($links, "{n}.{$associationForeignKey}");
|
$oldLinks = Set::extract($links, "{n}.{$associationForeignKey}");
|
||||||
if (!empty($oldLinks)) {
|
if (!empty($oldLinks)) {
|
||||||
|
|
|
@ -609,7 +609,7 @@ class ModelWriteTest extends BaseModelTest {
|
||||||
function testBeforeValidateSaveAbortion() {
|
function testBeforeValidateSaveAbortion() {
|
||||||
$Model =& new CallbackPostTestModel();
|
$Model =& new CallbackPostTestModel();
|
||||||
$Model->beforeValidateReturn = false;
|
$Model->beforeValidateReturn = false;
|
||||||
|
|
||||||
$data = array(
|
$data = array(
|
||||||
'title' => 'new article',
|
'title' => 'new article',
|
||||||
'body' => 'this is some text.'
|
'body' => 'this is some text.'
|
||||||
|
@ -1992,6 +1992,54 @@ class ModelWriteTest extends BaseModelTest {
|
||||||
));
|
));
|
||||||
$this->assertEqual($result, $expected);
|
$this->assertEqual($result, $expected);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* test that saving habtm records respects conditions set in the the 'conditions' key
|
||||||
|
* for the association.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function testHabtmSaveWithConditionsInAssociation() {
|
||||||
|
$this->loadFixtures('JoinThing', 'Something', 'SomethingElse');
|
||||||
|
$Something =& new Something();
|
||||||
|
$Something->unbindModel(array('hasAndBelongsToMany' => array('SomethingElse')), false);
|
||||||
|
|
||||||
|
$Something->bindModel(array(
|
||||||
|
'hasAndBelongsToMany' => array(
|
||||||
|
'DoomedSomethingElse' => array(
|
||||||
|
'className' => 'SomethingElse',
|
||||||
|
'joinTable' => 'join_things',
|
||||||
|
'conditions' => 'JoinThing.doomed = 1',
|
||||||
|
'unique' => true
|
||||||
|
),
|
||||||
|
'NotDoomedSomethingElse' => array(
|
||||||
|
'className' => 'SomethingElse',
|
||||||
|
'joinTable' => 'join_things',
|
||||||
|
'conditions' => array('JoinThing.doomed' => 0),
|
||||||
|
'unique' => true
|
||||||
|
)
|
||||||
|
)
|
||||||
|
), false);
|
||||||
|
$result = $Something->read(null, 1);
|
||||||
|
$this->assertTrue(empty($result['NotDoomedSomethingElse']));
|
||||||
|
$this->assertEqual(count($result['DoomedSomethingElse']), 1);
|
||||||
|
|
||||||
|
$data = array(
|
||||||
|
'Something' => array('id' => 1),
|
||||||
|
'NotDoomedSomethingElse' => array(
|
||||||
|
'NotDoomedSomethingElse' => array(
|
||||||
|
array('something_else_id' => 2, 'doomed' => 0),
|
||||||
|
array('something_else_id' => 3, 'doomed' => 0)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
$Something->create($data);
|
||||||
|
$result = $Something->save();
|
||||||
|
$this->assertTrue($result);
|
||||||
|
|
||||||
|
$result = $Something->read(null, 1);
|
||||||
|
$this->assertEqual(count($result['NotDoomedSomethingElse']), 2);
|
||||||
|
$this->assertEqual(count($result['DoomedSomethingElse']), 1);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* testHabtmSaveKeyResolution method
|
* testHabtmSaveKeyResolution method
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue