Skip to content

Commit

Permalink
add tool
Browse files Browse the repository at this point in the history
  • Loading branch information
stelin committed Mar 23, 2018
1 parent 2ff10e3 commit a163549
Show file tree
Hide file tree
Showing 4 changed files with 346 additions and 4 deletions.
64 changes: 64 additions & 0 deletions src/Db.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,68 @@ public static function query(string $sql = '', string $group = Pool::GROUP): Que

return new $queryBuilderClassName($group, $sql);
}

/**
* @param string $group
*
* @return \Swoft\Db\QueryBuilder
*/
public static function delete(string $group = Pool::GROUP)
{
$queryBuilderClassName = DbHelper::getQueryClassNameByGroup($group);
/* @var \Swoft\Db\QueryBuilder $queryBuidler */
$queryBuidler = new $queryBuilderClassName($group);
$queryBuidler->delete();

return $queryBuidler;
}

/**
* @param string $tableName
* @param string $group
*
* @return \Swoft\Db\QueryBuilder
*/
public static function insert(string $tableName, string $group = Pool::GROUP)
{
$queryBuilderClassName = DbHelper::getQueryClassNameByGroup($group);
/* @var \Swoft\Db\QueryBuilder $queryBuidler */
$queryBuidler = new $queryBuilderClassName($group);
$queryBuidler->insert($tableName);

return $queryBuidler;
}

/**
* @param string $tableName
* @param string $group
*
* @return \Swoft\Db\QueryBuilder
*/
public static function update(string $tableName, string $group = Pool::GROUP)
{
$queryBuilderClassName = DbHelper::getQueryClassNameByGroup($group);
/* @var \Swoft\Db\QueryBuilder $queryBuidler */
$queryBuidler = new $queryBuilderClassName($group);
$queryBuidler->update($tableName);

return $queryBuidler;
}

/**
* @param mixed $column
* @param string|null $alias
* @param string $group
*
* @return \Swoft\Db\QueryBuilder
*/
public static function select($column, string $alias = null, string $group = Pool::GROUP)
{
$queryBuilderClassName = DbHelper::getQueryClassNameByGroup($group);
/* @var \Swoft\Db\QueryBuilder $queryBuidler */
$queryBuidler = new $queryBuilderClassName($group);
$queryBuidler->select($column, $alias);

return $queryBuidler;
}
}
148 changes: 146 additions & 2 deletions src/Model.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@
namespace Swoft\Db;

use Swoft\Core\ResultInterface;
use Swoft\Db\Bean\Collector\EntityCollector;

/**
* The model of activerecord
*/
class Model
class Model implements \ArrayAccess, \Iterator
{
/**
* The data of old
Expand All @@ -16,6 +17,16 @@ class Model
*/
private $attrs = [];

/**
* Model constructor.
*
* @param array $attributes
*/
public function __construct(array $attributes = [])
{
$this->fill($attributes);
}

/**
* Insert data to db
*
Expand Down Expand Up @@ -144,7 +155,6 @@ public static function query(string $group = Pool::GROUP): QueryBuilder
return EntityManager::getQuery(static::class, $group);
}


/**
* Get the exeutor
*
Expand Down Expand Up @@ -192,4 +202,138 @@ public function fill(array $attributes)
}
}
}

/**
* @return string
*/
public function __toString(): string
{
return $this->toJson();
}

/**
* @return array
*/
public function toArray(): array
{
$entities = EntityCollector::getCollector();
$columns = $entities[static::class]['field'];

$data = [];
foreach ($columns as $propertyName => $column) {
$methodName = sprintf('get%s', ucfirst($propertyName));
if (!method_exists($this, $methodName) || !isset($column['column'])) {
continue;
}

$data[$propertyName] = $this->$methodName();
}

return $data;
}

/**
* @return string
*/
public function toJson(): string
{
return json_encode($this->toArray(), JSON_UNESCAPED_UNICODE);
}

/**
* Whether a offset exists
*
* @param mixed $offset
*
* @return boolean true on success or false on failure.
*/
public function offsetExists($offset)
{
$data = $this->toArray();

return isset($data[$offset]);
}

/**
* Offset to retrieve
*
* @param mixed $offset
*
* @return mixed Can return all value types.
*/
public function offsetGet($offset)
{
$data = $this->toArray();
$value = $data[$offset]??null;

return $value;
}

/**
* Offset to set
*
* @param mixed $offset
* @param mixed $value
*
* @return void
*/
public function offsetSet($offset, $value)
{
$this->fill([$offset => $value]);
}

/**
* @param mixed $offset
*/
public function offsetUnset($offset)
{

}

/**
* Return the current element
*
* @return mixed Can return any type.
*/
public function current()
{
return current($this->attrs);
}

/**
* Move forward to next element
* @return void Any returned value is ignored.
*/
public function next()
{
next($this->attrs);
}

/**
* Return the key of the current element
* @return mixed scalar on success, or null on failure.
*/
public function key()
{
return key($this->attrs);
}

/**
* Checks if current position is valid
* @return boolean The return value will be casted to boolean and then evaluated.
* Returns true on success or false on failure.
*/
public function valid()
{
return ($this->current() !== false);
}

/**
* Rewind the Iterator to the first element
* @return void Any returned value is ignored.
*/
public function rewind()
{
reset($this->attrs);
}
}
7 changes: 5 additions & 2 deletions src/QueryBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -321,13 +321,16 @@ public function delete(): QueryBuilder
/**
* select语句
*
* @param string $column
* @param mixed $column
* @param string $alias
*
* @return QueryBuilder
*/
public function select(string $column, string $alias = null): QueryBuilder
public function select($column, string $alias = null): QueryBuilder
{
if (is_array($column)) {
return $this->selects($column);
}
$this->select[$column] = $alias;

return $this;
Expand Down
131 changes: 131 additions & 0 deletions test/Cases/EntityTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
<?php

namespace Swoft\Db\Test\Cases;

use Swoft\Db\Db;
use Swoft\Db\Test\Testing\Entity\User;

/**
*/
class EntityTest extends DbTestCase
{
public function testToArray()
{
$age = mt_rand(1, 100);
$user = new User();
$user->setId(12);
$user->setName('stelin');
$user->setSex(1);
$user->setDesc('this my desc');
$user->setAge($age);

$array = $user->toArray();

$data = [
'id' => 12,
'name' => 'stelin',
'sex' => 1,
'desc' => 'this my desc',
'age' => $age,
];
$this->assertEquals($data, $array);
}

public function testToJson()
{
$age = mt_rand(1, 100);
$user = new User();
$user->setId(12);
$user->setName('stelin');
$user->setSex(1);
$user->setDesc('this my desc');
$user->setAge($age);

$json = $user->toJson();
$string = $user->__toString();
$data = '{"id":12,"name":"stelin","age":' . $age . ',"sex":1,"desc":"this my desc"}';
$this->assertEquals($data, $json);
$this->assertEquals($data, $string);
}

public function testArrayAccess()
{
$age = mt_rand(1, 100);
$user = new User();
$user->setId(12);
$user->setName('stelin');
$user->setSex(1);
$user->setDesc('this my desc');

$user['age'] = $age;

$this->assertEquals('stelin', $user['name']);
$this->assertEquals($age, $user['age']);
$this->assertTrue(isset($user['sex']));
}

/**
* @dataProvider mysqlProvider
*
* @param int $id
*/
public function testIterator($id)
{
$user = User::findById($id)->getResult(User::class);
$data = [];
foreach ($user as $key => $value){
$data[$key] = $value;
}

$this->assertEquals($data, $user->toArray());
}

/**
* @dataProvider mysqlProvider
*
* @param int $id
*/
public function testDbSelect(int $id)
{
$result = Db::select('*')->from(User::class)->where('id', $id)->limit(1)->execute()->getResult();
$this->assertEquals($id, $result['id']);
}

/**
* @dataProvider mysqlProvider
*
* @param int $id
*/
public function testDbDelete(int $id)
{
$result = Db::delete()->from(User::class)->where('id', $id)->execute()->getResult();
$this->assertEquals(1, $result);
}

/**
* @dataProvider mysqlProvider
*
* @param int $id
*/
public function testDbUpdate(int $id)
{
$result = Db::update(User::class)->set(['name' => 'stelin666'])->where('id', $id)->execute()->getResult();
$user = User::findById($id)->getResult();
$this->assertEquals('stelin666', $user['name']);
}

public function testDbInsert()
{
$values = [
'name' => 'stelin',
'sex' => 1,
'description' => 'this my desc',
'age' => 99,
];

$result = Db::insert(User::class)->set($values)->execute()->getResult();
$user = User::findById($result)->getResult();
$this->assertCount(5, $user);
}

}

0 comments on commit a163549

Please sign in to comment.