mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
FIX: DataQuery::applyRelation using incorrect foreign key (fixes #3954)
This commit is contained in:
parent
4e340ca7ab
commit
f234301c0a
@ -608,8 +608,7 @@ class DataQuery {
|
|||||||
$model = singleton($modelClass);
|
$model = singleton($modelClass);
|
||||||
if ($component = $model->has_one($rel)) {
|
if ($component = $model->has_one($rel)) {
|
||||||
if(!$this->query->isJoinedTo($component)) {
|
if(!$this->query->isJoinedTo($component)) {
|
||||||
$has_one = array_flip($model->has_one());
|
$foreignKey = $rel;
|
||||||
$foreignKey = $has_one[$component];
|
|
||||||
$realModelClass = ClassInfo::table_for_object_field($modelClass, "{$foreignKey}ID");
|
$realModelClass = ClassInfo::table_for_object_field($modelClass, "{$foreignKey}ID");
|
||||||
$this->query->addLeftJoin($component,
|
$this->query->addLeftJoin($component,
|
||||||
"\"$component\".\"ID\" = \"{$realModelClass}\".\"{$foreignKey}ID\"");
|
"\"$component\".\"ID\" = \"{$realModelClass}\".\"{$foreignKey}ID\"");
|
||||||
|
@ -49,6 +49,19 @@ class DataQueryTest extends SapphireTest {
|
|||||||
$dq->sql());
|
$dq->sql());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testApplyRelation() {
|
||||||
|
// Test applyRelation with two has_ones pointing to the same class
|
||||||
|
$dq = new DataQuery('DataQueryTest_B');
|
||||||
|
$dq->applyRelation('TestC');
|
||||||
|
$this->assertTrue($dq->query()->isJoinedTo('DataQueryTest_C'));
|
||||||
|
$this->assertContains('"DataQueryTest_C"."ID" = "DataQueryTest_B"."TestCID"', $dq->sql());
|
||||||
|
|
||||||
|
$dq = new DataQuery('DataQueryTest_B');
|
||||||
|
$dq->applyRelation('TestCTwo');
|
||||||
|
$this->assertTrue($dq->query()->isJoinedTo('DataQueryTest_C'));
|
||||||
|
$this->assertContains('"DataQueryTest_C"."ID" = "DataQueryTest_B"."TestCTwoID"', $dq->sql());
|
||||||
|
}
|
||||||
|
|
||||||
public function testApplyReplationDeepInheretence() {
|
public function testApplyReplationDeepInheretence() {
|
||||||
$newDQ = new DataQuery('DataQueryTest_E');
|
$newDQ = new DataQuery('DataQueryTest_E');
|
||||||
//apply a relation to a relation from an ancestor class
|
//apply a relation to a relation from an ancestor class
|
||||||
@ -253,6 +266,7 @@ class DataQueryTest_B extends DataObject implements TestOnly {
|
|||||||
|
|
||||||
private static $has_one = array(
|
private static $has_one = array(
|
||||||
'TestC' => 'DataQueryTest_C',
|
'TestC' => 'DataQueryTest_C',
|
||||||
|
'TestCTwo' => 'DataQueryTest_C',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,7 +283,8 @@ class DataQueryTest_C extends DataObject implements TestOnly {
|
|||||||
|
|
||||||
private static $has_many = array(
|
private static $has_many = array(
|
||||||
'TestAs' => 'DataQueryTest_A',
|
'TestAs' => 'DataQueryTest_A',
|
||||||
'TestBs' => 'DataQueryTest_B',
|
'TestBs' => 'DataQueryTest_B.TestC',
|
||||||
|
'TestBsTwo' => 'DataQueryTest_B.TestCTwo',
|
||||||
);
|
);
|
||||||
|
|
||||||
private static $many_many = array(
|
private static $many_many = array(
|
||||||
|
Loading…
Reference in New Issue
Block a user