Skip to content

Commit f00cd75

Browse files
committed
Merge pull request #20 from moufmouf/1.1
Fixes problem in MagicJoin when some kind of branching join did happen
2 parents 3424082 + f9f91cb commit f00cd75

File tree

3 files changed

+70
-8
lines changed

3 files changed

+70
-8
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ $completeSql = $magicQuery->build($sql, ['isAdmin' => true]);
133133
into the SQL query. You should use classic SQL parameters for this. This means that instead if writing
134134
<code>{{ id }}</code>, you should write <code>:id</code>.</div>
135135

136-
Want to know more? <a class="btn btn-primary" href="doc/magic_twig.md">Check out the MagicTwig guide!</a>
136+
Want to know more? <a class="btn btn-primary btn-large" href="doc/magic_twig.md">Check out the MagicTwig guide!</a>
137137

138138
<a name="twig"></a>
139139
Use Twig templating in your SQL queries!

src/Mouf/Database/MagicQuery.php

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,8 @@ private function magicJoinOnOneQuery(MagicJoinSelect $magicJoinSelect) {
183183
$tableNode = new Table();
184184
$tableNode->setTable($mainTable);
185185
$tables = [
186-
$tableNode
186+
$mainTable => $tableNode
187187
];
188-
$currentTable = $mainTable;
189188

190189
foreach ($completePath as $foreignKey) {
191190
/* @var $foreignKey \Doctrine\DBAL\Schema\ForeignKeyConstraint */
@@ -206,15 +205,13 @@ private function magicJoinOnOneQuery(MagicJoinSelect $magicJoinSelect) {
206205
$tableNode->setJoinType("LEFT JOIN");
207206
$tableNode->setRefClause($onNode);
208207

209-
if ($foreignKey->getLocalTableName() == $currentTable) {
208+
if (isset($tables[$foreignKey->getLocalTableName()])) {
210209
$tableNode->setTable($foreignKey->getForeignTableName());
211-
$currentTable = $foreignKey->getForeignTableName();
210+
$tables[$foreignKey->getForeignTableName()] = $tableNode;
212211
} else {
213212
$tableNode->setTable($foreignKey->getLocalTableName());
214-
$currentTable = $foreignKey->getLocalTableName();
213+
$tables[$foreignKey->getLocalTableName()] = $tableNode;
215214
}
216-
217-
$tables[] = $tableNode;
218215
}
219216

220217
$select->setFrom($tables);

tests/Mouf/Database/MagicQueryTest.php

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,71 @@ public function testMagicJoin() {
146146
$this->assertEquals($expectedSql, self::simplifySql($magicQuery->build($sql)));
147147
}
148148

149+
public function testMagicJoin2() {
150+
$schema = new Schema();
151+
$role = $schema->createTable("role");
152+
$role->addColumn("id", "integer", array("unsigned" => true));
153+
$role->addColumn("label", "string", array("length" => 32));
154+
155+
$right = $schema->createTable("right");
156+
$right->addColumn("id", "integer", array("unsigned" => true));
157+
$right->addColumn("label", "string", array("length" => 32));
158+
$role_right = $schema->createTable("role_right");
159+
160+
$role_right->addColumn("role_id", "integer", array("unsigned" => true));
161+
$role_right->addColumn("right_id", "integer", array("unsigned" => true));
162+
$role_right->addForeignKeyConstraint($schema->getTable('role'), array("role_id"), array("id"), array("onUpdate" => "CASCADE"));
163+
$role_right->addForeignKeyConstraint($schema->getTable('right'), array("right_id"), array("id"), array("onUpdate" => "CASCADE"));
164+
$role_right->setPrimaryKey(["role_id", "right_id"]);
165+
166+
$user = $schema->createTable("user");
167+
$user->addColumn("id", "integer", array("unsigned" => true));
168+
$user->addColumn("login", "string", array("length" => 32));
169+
$user->addColumn("role_id", "integer", array("unsigned" => true));
170+
$user->addForeignKeyConstraint($schema->getTable('role'), array("role_id"), array("id"), array("onUpdate" => "CASCADE"));
171+
172+
$schemaAnalyzer = new SchemaAnalyzer(new StubSchemaManager($schema));
173+
174+
$magicQuery = new MagicQuery(null, null, $schemaAnalyzer);
175+
176+
$sql = "SELECT role.* FROM magicjoin(role) WHERE right.label = 'my_right' AND user.login = 'foo'";
177+
$expectedSql = "SELECT role.* FROM role LEFT JOIN role_right ON (role_right.role_id = role.id) LEFT JOIN right ON (role_right.right_id = right.id) LEFT JOIN user ON (user.role_id = role.id) WHERE (right.label = 'my_right') AND (user.login = 'foo')";
178+
$this->assertEquals($expectedSql, self::simplifySql($magicQuery->build($sql)));
179+
}
180+
181+
public function testMagicJoin3() {
182+
$schema = new Schema();
183+
$role = $schema->createTable("role");
184+
$role->addColumn("id", "integer", array("unsigned" => true));
185+
$role->addColumn("label", "string", array("length" => 32));
186+
187+
$right = $schema->createTable("right");
188+
$right->addColumn("id", "integer", array("unsigned" => true));
189+
$right->addColumn("label", "string", array("length" => 32));
190+
$role_right = $schema->createTable("role_right");
191+
192+
$role_right->addColumn("role_id", "integer", array("unsigned" => true));
193+
$role_right->addColumn("right_id", "integer", array("unsigned" => true));
194+
$role_right->addForeignKeyConstraint($schema->getTable('role'), array("role_id"), array("id"), array("onUpdate" => "CASCADE"));
195+
$role_right->addForeignKeyConstraint($schema->getTable('right'), array("right_id"), array("id"), array("onUpdate" => "CASCADE"));
196+
$role_right->setPrimaryKey(["role_id", "right_id"]);
197+
198+
$status = $schema->createTable("status");
199+
$status->addColumn("id", "integer", array("unsigned" => true));
200+
$status->addColumn("name", "string", array("length" => 32));
201+
202+
$role->addColumn("status_id", "integer", array("unsigned" => true));
203+
$role->addForeignKeyConstraint($schema->getTable('status'), array("status_id"), array("id"), array("onUpdate" => "CASCADE"));
204+
205+
$schemaAnalyzer = new SchemaAnalyzer(new StubSchemaManager($schema));
206+
207+
$magicQuery = new MagicQuery(null, null, $schemaAnalyzer);
208+
209+
$sql = "SELECT role.* FROM magicjoin(role) WHERE right.label = 'my_right' AND status.name = 'foo'";
210+
$expectedSql = "SELECT role.* FROM role LEFT JOIN role_right ON (role_right.role_id = role.id) LEFT JOIN right ON (role_right.right_id = right.id) LEFT JOIN status ON (role.status_id = status.id) WHERE (right.label = 'my_right') AND (status.name = 'foo')";
211+
$this->assertEquals($expectedSql, self::simplifySql($magicQuery->build($sql)));
212+
}
213+
149214
/**
150215
* @expectedException \Mouf\Database\MagicQueryMissingConnectionException
151216
*/

0 commit comments

Comments
 (0)