Skip to content

Commit 277e87a

Browse files
authored
Merge pull request #100 from nathandentzau/nathandentzau/join-custom-self-column
Allow custom self column in join
2 parents a941d33 + 2c2b3ab commit 277e87a

File tree

2 files changed

+53
-20
lines changed

2 files changed

+53
-20
lines changed

src/Manipulation/JoinQuery.php

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010

1111
namespace NilPortugues\Sql\QueryBuilder\Manipulation;
1212

13-
use NilPortugues\Sql\QueryBuilder\Syntax\SyntaxFactory;
1413
use NilPortugues\Sql\QueryBuilder\Syntax\Where;
14+
use NilPortugues\Sql\QueryBuilder\Syntax\Column;
15+
use NilPortugues\Sql\QueryBuilder\Syntax\SyntaxFactory;
1516

1617
/**
1718
* Class JoinQuery.
@@ -70,8 +71,8 @@ public function setTable($table)
7071

7172
/**
7273
* @param string $table
73-
* @param string $selfColumn
74-
* @param string $refColumn
74+
* @param mixed $selfColumn
75+
* @param mixed $refColumn
7576
* @param string[] $columns
7677
*
7778
* @return Select
@@ -83,8 +84,8 @@ public function leftJoin($table, $selfColumn = null, $refColumn = null, $columns
8384

8485
/**
8586
* @param string $table
86-
* @param string $selfColumn
87-
* @param string $refColumn
87+
* @param mixed $selfColumn
88+
* @param mixed $refColumn
8889
* @param string[] $columns
8990
* @param string $joinType
9091
*
@@ -110,8 +111,8 @@ public function join(
110111

111112
/**
112113
* @param Select $select
113-
* @param string $selfColumn
114-
* @param string $refColumn
114+
* @param mixed $selfColumn
115+
* @param mixed $refColumn
115116
*
116117
* @return Select
117118
*/
@@ -121,11 +122,15 @@ public function addJoin(Select $select, $selfColumn, $refColumn)
121122
$table = $select->getTable()->getName();
122123

123124
if (!isset($this->joins[$table])) {
124-
$newColumn = array($selfColumn);
125-
$select->joinCondition()->equals(
126-
$refColumn,
127-
SyntaxFactory::createColumn($newColumn, $this->select->getTable())
128-
);
125+
if (!$selfColumn instanceof Column) {
126+
$newColumn = array($selfColumn);
127+
$selfColumn = SyntaxFactory::createColumn(
128+
$newColumn,
129+
$this->select->getTable()
130+
);
131+
}
132+
133+
$select->joinCondition()->equals($refColumn, $selfColumn);
129134
$this->joins[$table] = $select;
130135
}
131136

@@ -148,8 +153,8 @@ public function setJoin($isJoin = true)
148153

149154
/**
150155
* @param string $table
151-
* @param string $selfColumn
152-
* @param string $refColumn
156+
* @param mixed $selfColumn
157+
* @param mixed $refColumn
153158
* @param string[] $columns
154159
*
155160
* @internal param null $selectClass
@@ -163,8 +168,8 @@ public function rightJoin($table, $selfColumn = null, $refColumn = null, $column
163168

164169
/**
165170
* @param string $table
166-
* @param string $selfColumn
167-
* @param string $refColumn
171+
* @param mixed $selfColumn
172+
* @param mixed $refColumn
168173
* @param string[] $columns
169174
*
170175
* @return Select
@@ -176,8 +181,8 @@ public function crossJoin($table, $selfColumn = null, $refColumn = null, $column
176181

177182
/**
178183
* @param string $table
179-
* @param string $selfColumn
180-
* @param string $refColumn
184+
* @param mixed $selfColumn
185+
* @param mixed $refColumn
181186
* @param string[] $columns
182187
*
183188
* @return Select

tests/Builder/Syntax/SelectWriterTest.php

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010

1111
namespace NilPortugues\Tests\Sql\QueryBuilder\Builder\Syntax;
1212

13-
use NilPortugues\Sql\QueryBuilder\Builder\GenericBuilder;
14-
use NilPortugues\Sql\QueryBuilder\Manipulation\Select;
13+
use NilPortugues\Sql\QueryBuilder\Syntax\Column;
1514
use NilPortugues\Sql\QueryBuilder\Syntax\OrderBy;
15+
use NilPortugues\Sql\QueryBuilder\Manipulation\Select;
16+
use NilPortugues\Sql\QueryBuilder\Builder\GenericBuilder;
1617

1718
/**
1819
* Class SelectWriterTest.
@@ -356,6 +357,33 @@ public function itShouldBeAbleToDoAJoinWithOrderByOnJoinedTable()
356357
$this->assertSame($expected, $this->writer->write($this->query));
357358
}
358359

360+
/**
361+
* @test
362+
*/
363+
public function itShouldBeAbleToDoAJoinWithCustomColumns()
364+
{
365+
$this->query
366+
->setTable('user')
367+
->setColumns(
368+
array(
369+
'userId' => 'user_id',
370+
'username' => 'name',
371+
'email' => 'email',
372+
'created_at',
373+
)
374+
)
375+
->orderBy('user_id', OrderBy::DESC)
376+
->join('news', 'user_id', 'author_id', array('title', 'body', 'created_at', 'updated_at'))
377+
->orderBy('created_at', OrderBy::DESC)
378+
->join('articles', new Column('news_id', 'article'), new Column('id', 'news'));
379+
380+
$expected = 'SELECT user.user_id AS "userId", user.name AS "username", user.email AS "email", user.created_at,'.
381+
' news.title, news.body, news.created_at, news.updated_at FROM user JOIN news ON (news.author_id ='.
382+
' user.user_id) JOIN articles ON (news.id = article.news_id) ORDER BY user.user_id DESC, news.created_at DESC';
383+
384+
$this->assertSame($expected, $this->writer->write($this->query));
385+
}
386+
359387
/**
360388
* @test
361389
*/

0 commit comments

Comments
 (0)