Skip to content

Commit

Permalink
Table options support (#35)
Browse files Browse the repository at this point in the history
* Table options support

* Test setting options doesn't interfere with schema name

Signed-off-by: Hidde Beydals <[email protected]>

* Make primaryTable options buildable

* Add tests for charset and collate

* Test ->collate()->charset()->schema() chain

* Call build() on Table instance

* Refactor to use callbackAndQueue instead of build
  • Loading branch information
hiddeco authored and patrickbrouwers committed May 10, 2016
1 parent c1f72e7 commit de6a6cd
Show file tree
Hide file tree
Showing 3 changed files with 137 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/Builders/Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public function table($name, callable $callback = null)

$table = new Table($this->builder, $name);

$this->callIfCallable($callback, $table);
$this->callbackAndQueue($table, $callback);

return $table;
}
Expand Down
72 changes: 70 additions & 2 deletions src/Builders/Table.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,20 @@
namespace LaravelDoctrine\Fluent\Builders;

use Doctrine\ORM\Mapping\Builder\ClassMetadataBuilder;
use LaravelDoctrine\Fluent\Buildable;
use LaravelDoctrine\Fluent\Builders\Traits\Queueable;

class Table extends AbstractBuilder
class Table extends AbstractBuilder implements Buildable
{
use Queueable {
build as buildQueued;
}

/**
* @var array
*/
protected $primaryTable = [];

/**
* @param ClassMetadataBuilder $builder
* @param string|callable|null $name
Expand Down Expand Up @@ -40,8 +51,65 @@ public function setName($name)
*/
public function schema($schema)
{
$this->builder->getClassMetadata()->setPrimaryTable(['schema' => $schema]);
$this->primaryTable['schema'] = $schema;

return $this;
}

/**
* @param string $charset
*
* @return $this
*/
public function charset($charset)
{
$this->option('charset', $charset);

return $this;
}

/**
* @param string $collate
*
* @return $this
*/
public function collate($collate)
{
$this->option('collate', $collate);

return $this;
}

/**
* @param array $options
*
* @return $this
*/
public function options(array $options = [])
{
$this->primaryTable['options'] = $options;

return $this;
}

/**
* @param string $name
* @param string $value
*
* @return $this
*/
public function option($name, $value)
{
$this->primaryTable['options'][$name] = $value;

return $this;
}

/**
* Execute the build process
*/
public function build()
{
$this->builder->getClassMetadata()->setPrimaryTable($this->primaryTable);
}
}
66 changes: 66 additions & 0 deletions tests/Builders/TableTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,72 @@ public function test_can_change_only_the_schema()
{
$this->table->schema('a_schema');

$this->table->build();

$this->assertEquals('a_schema', $this->builder->getClassMetadata()->getSchemaName());
}

public function test_can_set_options()
{
$this->table->options([
'collate' => 'utf8mb4_unicode_ci',
'charset' => 'utf8mb4'
]);

$this->table->build();

$this->assertEquals([
'collate' => 'utf8mb4_unicode_ci',
'charset' => 'utf8mb4'
], $this->builder->getClassMetadata()->table['options']);
}

public function test_set_options_does_not_touch_other_data() {
$table = $this->table->getClassMetadata()->table;

$this->table->options(['collate' => 'utf8mb4_unicode_ci']);
$table['options'] = ['collate' => 'utf8mb4_unicode_ci'];

$this->table->build();

$this->assertEquals($table, $this->builder->getClassMetadata()->table);
}

public function test_can_set_options_and_change_schema () {
$this->table->options(['collate' => 'utf8mb4_unicode_ci']);
$this->table->schema('a_schema');

$this->table->build();

$this->assertEquals('a_schema', $this->builder->getClassMetadata()->getSchemaName());
$this->assertEquals(['collate' => 'utf8mb4_unicode_ci'], $this->builder->getClassMetadata()->table['options']);
}

public function test_can_set_charset() {
$this->table->charset('utf8mb4');

$this->table->build();

$this->assertEquals('utf8mb4', $this->builder->getClassMetadata()->table['options']['charset']);
}

public function test_can_set_collate() {
$this->table->collate('utf8mb4_unicode_ci');

$this->table->build();

$this->assertEquals('utf8mb4_unicode_ci', $this->builder->getClassMetadata()->table['options']['collate']);
}

public function test_can_chain_collate_charset_schema() {
$this->table->collate('utf8mb4_unicode_ci')->charset('utf8mb4')->schema('a_schema');

$this->table->build();

$this->assertEquals('a_schema', $this->builder->getClassMetadata()->table['schema']);
$this->assertEquals([
'collate' => 'utf8mb4_unicode_ci',
'charset' => 'utf8mb4'
], $this->builder->getClassMetadata()->table['options']);
}
}

0 comments on commit de6a6cd

Please sign in to comment.