Commit 3e75c117 by Carsten Brandt

cleanup and reorder methods in redis ar + added link+unlink

parent 28c7acc4
<?php <?php
/** /**
* ActiveRecord class file.
*
* @author Carsten Brandt <mail@cebe.cc>
* @link http://www.yiiframework.com/ * @link http://www.yiiframework.com/
* @copyright Copyright &copy; 2008 Yii Software LLC * @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/ * @license http://www.yiiframework.com/license/
*/ */
......
<?php <?php
/** /**
* ActiveRecord class file.
*
* @author Carsten Brandt <mail@cebe.cc>
* @link http://www.yiiframework.com/ * @link http://www.yiiframework.com/
* @copyright Copyright &copy; 2008 Yii Software LLC * @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/ * @license http://www.yiiframework.com/license/
*/ */
namespace yii\redis; namespace yii\redis;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
// TODO this class is nearly completely duplicated from yii\db\ActiveRelation
/** /**
* ActiveRecord is the base class for classes representing relational data in terms of objects. * ActiveRelation represents a relation between two Active Record classes.
*
* ActiveRelation instances are usually created by calling [[ActiveRecord::hasOne()]] and
* [[ActiveRecord::hasMany()]]. An Active Record class declares a relation by defining
* a getter method which calls one of the above methods and returns the created ActiveRelation object.
*
* A relation is specified by [[link]] which represents the association between columns
* of different tables; and the multiplicity of the relation is indicated by [[multiple]].
*
* If a relation involves a pivot table, it may be specified by [[via()]] or [[viaTable()]] method.
* *
* @author Carsten Brandt <mail@cebe.cc> * @author Carsten Brandt <mail@cebe.cc>
* @since 2.0 * @since 2.0
*/ */
class ActiveRelation extends \yii\redis\ActiveQuery class ActiveRelation extends ActiveQuery
{ {
/** /**
* @var boolean whether this relation should populate all query results into AR instances. * @var boolean whether this relation should populate all query results into AR instances.
......
<?php <?php
/** /**
* Connection class file
*
* @link http://www.yiiframework.com/ * @link http://www.yiiframework.com/
* @copyright Copyright &copy; 2008 Yii Software LLC * @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/ * @license http://www.yiiframework.com/license/
*/ */
......
<?php <?php
/** /**
* * @link http://www.yiiframework.com/
* * @copyright Copyright (c) 2008 Yii Software LLC
* @author Carsten Brandt <mail@cebe.cc> * @license http://www.yiiframework.com/license/
*/ */
namespace yii\redis; namespace yii\redis;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
use yii\db\TableSchema; use yii\db\TableSchema;
......
<?php
/**
* Transaction class file.
*
* @link http://www.yiiframework.com/
* @copyright Copyright &copy; 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\redis;
use yii\base\InvalidConfigException;
use yii\db\Exception;
/**
* Transaction represents a DB transaction.
*
* @property boolean $isActive Whether this transaction is active. Only an active transaction can [[commit()]]
* or [[rollBack()]]. This property is read-only.
*
* @author Carsten Brandt <mail@cebe.cc>
* @since 2.0
*/
class Transaction extends \yii\base\Object
{
/**
* @var Connection the database connection that this transaction is associated with.
*/
public $db;
/**
* @var boolean whether this transaction is active. Only an active transaction
* can [[commit()]] or [[rollBack()]]. This property is set true when the transaction is started.
*/
private $_active = false;
/**
* Returns a value indicating whether this transaction is active.
* @return boolean whether this transaction is active. Only an active transaction
* can [[commit()]] or [[rollBack()]].
*/
public function getIsActive()
{
return $this->_active;
}
/**
* Begins a transaction.
* @throws InvalidConfigException if [[connection]] is null
*/
public function begin()
{
if (!$this->_active) {
if ($this->db === null) {
throw new InvalidConfigException('Transaction::db must be set.');
}
\Yii::trace('Starting transaction', __CLASS__);
$this->db->open();
$this->db->createCommand('MULTI')->execute();
$this->_active = true;
}
}
/**
* Commits a transaction.
* @throws Exception if the transaction or the DB connection is not active.
*/
public function commit()
{
if ($this->_active && $this->db && $this->db->isActive) {
\Yii::trace('Committing transaction', __CLASS__);
$this->db->createCommand('EXEC')->execute();
// TODO handle result of EXEC
$this->_active = false;
} else {
throw new Exception('Failed to commit transaction: transaction was inactive.');
}
}
/**
* Rolls back a transaction.
* @throws Exception if the transaction or the DB connection is not active.
*/
public function rollback()
{
if ($this->_active && $this->db && $this->db->isActive) {
\Yii::trace('Rolling back transaction', __CLASS__);
$this->db->pdo->commit();
$this->_active = false;
} else {
throw new Exception('Failed to roll back transaction: transaction was inactive.');
}
}
}
...@@ -319,21 +319,20 @@ class ActiveRecordTest extends RedisTestCase ...@@ -319,21 +319,20 @@ class ActiveRecordTest extends RedisTestCase
$this->assertEquals(1, $order->customer_id); $this->assertEquals(1, $order->customer_id);
$this->assertEquals(1, $order->customer->id); $this->assertEquals(1, $order->customer->id);
// TODO support via // via model
// // via model $order = Order::find(1);
// $order = Order::find(1); $this->assertEquals(2, count($order->items));
// $this->assertEquals(2, count($order->items)); $this->assertEquals(2, count($order->orderItems));
// $this->assertEquals(2, count($order->orderItems)); $orderItem = OrderItem::find(array('order_id' => 1, 'item_id' => 3));
// $orderItem = OrderItem::find(array('order_id' => 1, 'item_id' => 3)); $this->assertNull($orderItem);
// $this->assertNull($orderItem); $item = Item::find(3);
// $item = Item::find(3); $order->link('items', $item, array('quantity' => 10, 'subtotal' => 100));
// $order->link('items', $item, array('quantity' => 10, 'subtotal' => 100)); $this->assertEquals(3, count($order->items));
// $this->assertEquals(3, count($order->items)); $this->assertEquals(3, count($order->orderItems));
// $this->assertEquals(3, count($order->orderItems)); $orderItem = OrderItem::find(array('order_id' => 1, 'item_id' => 3));
// $orderItem = OrderItem::find(array('order_id' => 1, 'item_id' => 3)); $this->assertTrue($orderItem instanceof OrderItem);
// $this->assertTrue($orderItem instanceof OrderItem); $this->assertEquals(10, $orderItem->quantity);
// $this->assertEquals(10, $orderItem->quantity); $this->assertEquals(100, $orderItem->subtotal);
// $this->assertEquals(100, $orderItem->subtotal);
} }
public function testUnlink() public function testUnlink()
...@@ -345,14 +344,13 @@ class ActiveRecordTest extends RedisTestCase ...@@ -345,14 +344,13 @@ class ActiveRecordTest extends RedisTestCase
$this->assertEquals(1, count($customer->orders)); $this->assertEquals(1, count($customer->orders));
$this->assertNull(Order::find(3)); $this->assertNull(Order::find(3));
// TODO support via // via model
// // via model $order = Order::find(2);
// $order = Order::find(2); $this->assertEquals(3, count($order->items));
// $this->assertEquals(3, count($order->items)); $this->assertEquals(3, count($order->orderItems));
// $this->assertEquals(3, count($order->orderItems)); $order->unlink('items', $order->items[2], true);
// $order->unlink('items', $order->items[2], true); $this->assertEquals(2, count($order->items));
// $this->assertEquals(2, count($order->items)); $this->assertEquals(2, count($order->orderItems));
// $this->assertEquals(2, count($order->orderItems));
} }
public function testInsert() public function testInsert()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment