Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 277e87a

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /