Skip to content

Commit

Permalink
add insert and update shortcuts
Browse files Browse the repository at this point in the history
  • Loading branch information
TomK committed Feb 9, 2015
1 parent 5241dc6 commit f09c5bd
Show file tree
Hide file tree
Showing 7 changed files with 133 additions and 33 deletions.
15 changes: 15 additions & 0 deletions src/Assembler/QueryAssembler.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class QueryAssembler
protected $_forPrepare = true;
protected $_parameters;
protected $_query;
protected $_data;

/**
* @param IStatement $statement
Expand All @@ -39,6 +40,20 @@ public function __construct(IStatement $statement = null, $forPrepare = true)
}
}

public function getData($key)
{
if(isset($this->_data[$key]))
{
return $this->_data[$key];
}
return null;
}

public function setData($key, $data)
{
$this->_data[$key] = $data;
}

public function assemble($reassemble = false)
{
if($reassemble || (!$this->_query))
Expand Down
16 changes: 13 additions & 3 deletions src/Assembler/Segments/ClauseAssembler.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

class ClauseAssembler extends AbstractSegmentAssembler
{
const MULTIPLE_VALUES = 'multiple_values';

public function __construct(IClause $clause)
{
$this->_segment = $clause;
Expand Down Expand Up @@ -112,9 +114,17 @@ public function assembleAbstractTableClause(AbstractTableClause $clause)

public function assembleValuesClause(ValuesClause $clause)
{
return $clause->getAction() . ' ('
. implode(', ', $this->assembleSegments($clause->getExpressions()))
. ')';
$assembled = '('
. implode(', ', $this->assembleSegments($clause->getExpressions()))
. ')';

$assembler = $this->getAssembler();
if($assembler->getData(self::MULTIPLE_VALUES))
{
return $assembled;
}
$assembler->setData(self::MULTIPLE_VALUES, true);
return $clause->getAction() . ' ' . $assembled;
}

public function assembleOrderByClause(OrderByClause $clause)
Expand Down
23 changes: 23 additions & 0 deletions src/Builder/QueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
use Packaged\QueryBuilder\Clause\DeleteClause;
use Packaged\QueryBuilder\Clause\SelectClause;
use Packaged\QueryBuilder\Statement\DeleteStatement;
use Packaged\QueryBuilder\Statement\InsertStatement;
use Packaged\QueryBuilder\Statement\QueryStatement;
use Packaged\QueryBuilder\Statement\UpdateStatement;

class QueryBuilder
{
Expand Down Expand Up @@ -37,4 +39,25 @@ public static function deleteFrom($from, ...$expressions)
}
return $statement;
}

public static function insert($table, ...$fields)
{
$statement = new InsertStatement();
$statement->insert($table, ...$fields);
return $statement;
}

public static function update($table, array $keyValues = null)
{
$statement = new UpdateStatement();
$statement->update($table);
if(!empty($keyValues))
{
foreach($keyValues as $field => $value)
{
$statement->set($field, $value);
}
}
return $statement;
}
}
52 changes: 52 additions & 0 deletions src/Builder/Traits/InsertTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php
namespace Packaged\QueryBuilder\Builder\Traits;

use Packaged\QueryBuilder\Clause\InsertClause;
use Packaged\QueryBuilder\Clause\ValuesClause;
use Packaged\QueryBuilder\Expression\FieldExpression;
use Packaged\QueryBuilder\Expression\ValueExpression;
use Packaged\QueryBuilder\Statement\IStatement;

trait InsertTrait
{
public function insert($table, ...$fields)
{

/**
* @var $this IStatement
*/
$clause = new InsertClause();
$this->addClause($clause);
$clause->setTable($table);

foreach($fields as $field)
{
if(!($field instanceof FieldExpression))
{
$field = FieldExpression::create($field);
}
$clause->addField($field);
}
return $this;
}

public function values(...$values)
{
/**
* @var $this IStatement
* @var $clause ValuesClause
*/
$clause = new ValuesClause();
$this->addClause($clause);

foreach($values as $value)
{
if(!($value instanceof ValueExpression))
{
$value = ValueExpression::create($value);
}
$clause->addExpression($value);
}
return $this;
}
}
4 changes: 4 additions & 0 deletions src/Statement/InsertStatement.php
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
<?php
namespace Packaged\QueryBuilder\Statement;

use Packaged\QueryBuilder\Builder\Traits\InsertTrait;

class InsertStatement extends AbstractStatement
{
use InsertTrait;

protected function _getOrder()
{
return ['INSERTINTO', 'VALUES'];
Expand Down
32 changes: 17 additions & 15 deletions tests/Statement/InsertStatementTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,43 +2,45 @@
namespace Packaged\Tests\QueryBuilder\Statement;

use Packaged\QueryBuilder\Assembler\QueryAssembler;
use Packaged\QueryBuilder\Clause\InsertClause;
use Packaged\QueryBuilder\Clause\ValuesClause;
use Packaged\QueryBuilder\Builder\QueryBuilder;
use Packaged\QueryBuilder\Expression\FieldExpression;
use Packaged\QueryBuilder\Expression\ValueExpression;
use Packaged\QueryBuilder\Statement\InsertStatement;

class InsertStatementTest extends \PHPUnit_Framework_TestCase
{
public function testAssemble()
{
$statement = new InsertStatement();

$insert = new InsertClause();
$insert->setTable('tbl');
$statement->addClause($insert);
$statement = QueryBuilder::insert('tbl');
$this->assertEquals(
'INSERT INTO tbl ()',
QueryAssembler::stringify($statement)
);

$insert->addField((new FieldExpression())->setField('id'));
$insert->addField((new FieldExpression())->setField('name'));
$statement = QueryBuilder::insert('tbl', 'field');
$this->assertEquals(
'INSERT INTO tbl (field)',
QueryAssembler::stringify($statement)
);

$statement->insert('tbl', FieldExpression::create('id'), 'name');

$this->assertEquals(
'INSERT INTO tbl (id, name)',
QueryAssembler::stringify($statement)
);

$values = new ValuesClause();
$values->addExpression(new ValueExpression());
$values->addExpression((new ValueExpression())->setValue("Test"));
$statement->addClause($values);

$statement->values(null, ValueExpression::create('Test'));
$this->assertEquals(
'INSERT INTO tbl (id, name) '
. 'VALUES (NULL, "Test")',
QueryAssembler::stringify($statement)
);

$statement->values('row2v1', 'row2v2');
$this->assertEquals(
'INSERT INTO tbl (id, name) '
. 'VALUES (NULL, "Test"), ("row2v1", "row2v2")',
QueryAssembler::stringify($statement)
);
}
}
24 changes: 9 additions & 15 deletions tests/Statement/UpdateStatementTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,23 @@
namespace Packaged\Tests\QueryBuilder\Statement;

use Packaged\QueryBuilder\Assembler\QueryAssembler;
use Packaged\QueryBuilder\Clause\SetClause;
use Packaged\QueryBuilder\Clause\UpdateClause;
use Packaged\QueryBuilder\Clause\WhereClause;
use Packaged\QueryBuilder\Builder\QueryBuilder;
use Packaged\QueryBuilder\Expression\Like\EndsWithExpression;
use Packaged\QueryBuilder\Expression\StringExpression;
use Packaged\QueryBuilder\Expression\TableExpression;
use Packaged\QueryBuilder\Predicate\EqualPredicate;
use Packaged\QueryBuilder\Predicate\LikePredicate;
use Packaged\QueryBuilder\Predicate\NotEqualPredicate;
use Packaged\QueryBuilder\Statement\UpdateStatement;

class UpdateStatementTest extends \PHPUnit_Framework_TestCase
{
public function testAssemble()
{
$statement = new UpdateStatement();

$statement->update(TableExpression::create('tbl'));
$this->assertEquals('UPDATE tbl', QueryAssembler::stringify($statement));
$statement = QueryBuilder::update('tbl', ['field1' => 'value1']);
$this->assertEquals(
'UPDATE tbl SET field1 = "value1"',
QueryAssembler::stringify($statement)
);

$statement->where(['NOT' => ['username' => null]]);
$this->assertEquals(
'UPDATE tbl WHERE username IS NOT NULL',
'UPDATE tbl SET field1 = "value1" WHERE username IS NOT NULL',
QueryAssembler::stringify($statement)
);

Expand All @@ -36,14 +30,14 @@ public function testAssemble()
)
);
$this->assertEquals(
'UPDATE tbl SET username = "john" '
'UPDATE tbl SET field1 = "value1", username = "john" '
. 'WHERE username IS NOT NULL AND name LIKE "Joh%"',
QueryAssembler::stringify($statement)
);

$statement->set('bob', null);
$this->assertEquals(
'UPDATE tbl SET username = "john", bob = NULL '
'UPDATE tbl SET field1 = "value1", username = "john", bob = NULL '
. 'WHERE username IS NOT NULL AND name LIKE "Joh%"',
QueryAssembler::stringify($statement)
);
Expand Down

0 comments on commit f09c5bd

Please sign in to comment.