Home » Database » DB_DataObject » Bug #10241
Cascading joins when one involves composite keys fails
Details
| Submitted | 2007-03-02 07:02 UTC |
|---|---|
| From | dsanders at baselinesolutions dot com dot au |
| Status | Bogus |
| Package | DB_DataObject |
| PHP Version | 5.2.1 |
| OS | Irrelevant |
| Roadmaps | (Not assigned) |
Comments
[2007-03-02 07:02 UTC] dsanders at baselinesolutions dot com dot au
Description:
------------
When calling joinAdd() using composite keys and using a joinee object that has already been joined to a third table, incorrect SQL is formed.
Test script:
---------------
links.ini:
[test_b]
fk_a,fk_b=test_a:key_a,key_b
fk_0 = test_0:id
$test_0 = DB_DataObject::factory('test_0');
$test_a = DB_DataObject::factory('test_a');
$test_b = DB_DataObject::factory('test_b');
$test_b->joinAdd($test_0);
$test_a->joinAdd($test_b);
DB_DataObject::debugLevel(1);
$test_a->find();
Expected result:
----------------
DO_Test_a: find:
DO_Test_a: QUERY: SELECT *
FROM test_a
INNER JOIN test_b ON test_b.fk_a=test_a.key_a AND test_b.fk_b=test_a.key_b
INNER JOIN test_0 ON test_0.id=test_b.fk_0
Actual result:
--------------
DO_Test_a: find:
DO_Test_a: QUERY: SELECT *
FROM test_a
INNER JOIN test_b ON test_b.fk_a=test_a.key_a
INNER JOIN test_0 ON test_0.id=test_b.fk_0 AND test_b.fk_b=test_a.key_b
INNER JOIN test_0 ON test_0.id=test_b.fk_0
[2007-03-02 07:11 UTC] dsanders at baselinesolutions dot com dot au
Here's a patch (basically only use {$appendJoin} in the final iteration):
@@ -3229,11 +3229,14 @@ class DB_DataObject extends DB_DataObjec
$key_count = count($ofield);
for($i = 0; $i < $key_count; $i++) {
if ($i == 0) {
- $this->_join .= " ON {$joinAs}.{$ofield[$i]}={$table}.{$tfield[$i]} {$appendJoin} ";
+ $this->_join .= " ON {$joinAs}.{$ofield[$i]}={$table}.{$tfield[$i]} ";
}
- else {
+ else if ($i == $key_count - 1) {
$this->_join .= " AND {$joinAs}.{$ofield[$i]}={$table}.{$tfield[$i]} {$appendJoin} ";
}
+ else {
+ $this->_join .= " AND {$joinAs}.{$ofield[$i]}={$table}.{$tfield[$i]} ";
+ }
}
} else {
$this->_join .= " ON {$joinAs}.{$ofield}={$table}.{$tfield} {$appendJoin} ";
[2007-03-02 07:17 UTC] dsanders at baselinesolutions dot com dot au
Sorry I'm an idiot, the correct package is DB_DataObject
[2007-03-02 07:22 UTC] dsanders at baselinesolutions dot com dot au
Added package version
[2007-03-02 07:40 UTC] dsanders at baselinesolutions dot com dot au
I see now it was fixed in CVS about a week ago.