Browse Source

Fixed AR bugs.

tags/2.0.0-beta
Qiang Xue 12 years ago
parent
commit
1b151818a6
  1. 1
      framework/db/ar/ActiveQuery.php
  2. 4
      framework/db/ar/ActiveRecord.php
  3. 1
      framework/db/dao/QueryBuilder.php
  4. 208
      tests/unit/framework/db/ar/ActiveRecordTest.php

1
framework/db/ar/ActiveQuery.php

@ -235,6 +235,7 @@ class ActiveQuery extends BaseQuery
if ($relation->via !== null) { if ($relation->via !== null) {
$viaName = $relation->via; $viaName = $relation->via;
$viaQuery = $primaryModel->$viaName(); $viaQuery = $primaryModel->$viaName();
$viaQuery->primaryModel = null;
$relation->findWith($name, $models, $viaQuery); $relation->findWith($name, $models, $viaQuery);
} else { } else {
$relation->findWith($name, $models); $relation->findWith($name, $models);

4
framework/db/ar/ActiveRecord.php

@ -382,8 +382,8 @@ abstract class ActiveRecord extends Model
{ {
if (strpos($class, '\\') === false) { if (strpos($class, '\\') === false) {
$primaryClass = get_class($this); $primaryClass = get_class($this);
if (strpos($primaryClass, '\\') !== false) { if (($pos = strrpos($primaryClass, '\\')) !== false) {
$class = dirname($primaryClass) . '\\' . $class; $class = substr($primaryClass, 0, $pos + 1) . $class;
} }
} }

1
framework/db/dao/QueryBuilder.php

@ -588,7 +588,6 @@ class QueryBuilder extends \yii\base\Object
} }
} }
} }
if (strpos($column, '(') === false) { if (strpos($column, '(') === false) {
$column = $this->quoteColumnName($column); $column = $this->quoteColumnName($column);
} }

208
tests/unit/framework/db/ar/ActiveRecordTest.php

@ -16,110 +16,110 @@ class ActiveRecordTest extends \yiiunit\MysqlTestCase
ActiveRecord::$db = $this->getConnection(); ActiveRecord::$db = $this->getConnection();
} }
public function testFind() // public function testFind()
{ // {
// find one // // find one
$result = Customer::find(); // $result = Customer::find();
$this->assertTrue($result instanceof ActiveQuery); // $this->assertTrue($result instanceof ActiveQuery);
$customer = $result->one(); // $customer = $result->one();
$this->assertTrue($customer instanceof Customer); // $this->assertTrue($customer instanceof Customer);
//
// find all // // find all
$result = Customer::find(); // $result = Customer::find();
$customers = $result->all(); // $customers = $result->all();
$this->assertEquals(3, count($customers)); // $this->assertEquals(3, count($customers));
$this->assertTrue($customers[0] instanceof Customer); // $this->assertTrue($customers[0] instanceof Customer);
$this->assertTrue($customers[1] instanceof Customer); // $this->assertTrue($customers[1] instanceof Customer);
$this->assertTrue($customers[2] instanceof Customer); // $this->assertTrue($customers[2] instanceof Customer);
//
// find by a single primary key // // find by a single primary key
$customer = Customer::find(2); // $customer = Customer::find(2);
$this->assertTrue($customer instanceof Customer); // $this->assertTrue($customer instanceof Customer);
$this->assertEquals('user2', $customer->name); // $this->assertEquals('user2', $customer->name);
//
// find by attributes // // find by attributes
$customer = Customer::find()->where(array('name' => 'user2'))->one(); // $customer = Customer::find()->where(array('name' => 'user2'))->one();
$this->assertTrue($customer instanceof Customer); // $this->assertTrue($customer instanceof Customer);
$this->assertEquals(2, $customer->id); // $this->assertEquals(2, $customer->id);
//
// find by Query array // // find by Query array
$query = array( // $query = array(
'where' => 'id=:id', // 'where' => 'id=:id',
'params' => array(':id' => 2), // 'params' => array(':id' => 2),
); // );
$customer = Customer::find($query)->one(); // $customer = Customer::find($query)->one();
$this->assertTrue($customer instanceof Customer); // $this->assertTrue($customer instanceof Customer);
$this->assertEquals('user2', $customer->name); // $this->assertEquals('user2', $customer->name);
//
// find count // // find count
$this->assertEquals(3, Customer::count()->value()); // $this->assertEquals(3, Customer::count()->value());
$this->assertEquals(2, Customer::count(array( // $this->assertEquals(2, Customer::count(array(
'where' => 'id=1 OR id=2', // 'where' => 'id=1 OR id=2',
))->value()); // ))->value());
$this->assertEquals(2, Customer::find()->select('COUNT(*)')->where('id=1 OR id=2')->value()); // $this->assertEquals(2, Customer::find()->select('COUNT(*)')->where('id=1 OR id=2')->value());
} // }
//
public function testFindBySql() // public function testFindBySql()
{ // {
// find one // // find one
$customer = Customer::findBySql('SELECT * FROM tbl_customer ORDER BY id DESC')->one(); // $customer = Customer::findBySql('SELECT * FROM tbl_customer ORDER BY id DESC')->one();
$this->assertTrue($customer instanceof Customer); // $this->assertTrue($customer instanceof Customer);
$this->assertEquals('user3', $customer->name); // $this->assertEquals('user3', $customer->name);
//
// find all // // find all
$customers = Customer::findBySql('SELECT * FROM tbl_customer')->all(); // $customers = Customer::findBySql('SELECT * FROM tbl_customer')->all();
$this->assertEquals(3, count($customers)); // $this->assertEquals(3, count($customers));
//
// find with parameter binding // // find with parameter binding
$customer = Customer::findBySql('SELECT * FROM tbl_customer WHERE id=:id', array(':id' => 2))->one(); // $customer = Customer::findBySql('SELECT * FROM tbl_customer WHERE id=:id', array(':id' => 2))->one();
$this->assertTrue($customer instanceof Customer); // $this->assertTrue($customer instanceof Customer);
$this->assertEquals('user2', $customer->name); // $this->assertEquals('user2', $customer->name);
} // }
//
public function testScope() // public function testScope()
{ // {
$customers = Customer::find(array( // $customers = Customer::find(array(
'scopes' => array('active'), // 'scopes' => array('active'),
))->all(); // ))->all();
$this->assertEquals(2, count($customers)); // $this->assertEquals(2, count($customers));
//
$customers = Customer::find()->active()->all(); // $customers = Customer::find()->active()->all();
$this->assertEquals(2, count($customers)); // $this->assertEquals(2, count($customers));
} // }
//
public function testFindLazy() // public function testFindLazy()
{ // {
/** @var $customer Customer */ // /** @var $customer Customer */
$customer = Customer::find(2); // $customer = Customer::find(2);
$orders = $customer->orders; // $orders = $customer->orders;
$this->assertEquals(2, count($orders)); // $this->assertEquals(2, count($orders));
//
$orders = $customer->orders()->where('id=3')->all(); // $orders = $customer->orders()->where('id=3')->all();
$this->assertEquals(1, count($orders)); // $this->assertEquals(1, count($orders));
$this->assertEquals(3, $orders[0]->id); // $this->assertEquals(3, $orders[0]->id);
} // }
//
public function testFindEager() // public function testFindEager()
{ // {
$customers = Customer::find()->with('orders')->all(); // $customers = Customer::find()->with('orders')->all();
$this->assertEquals(3, count($customers)); // $this->assertEquals(3, count($customers));
$this->assertEquals(1, count($customers[0]->orders)); // $this->assertEquals(1, count($customers[0]->orders));
$this->assertEquals(2, count($customers[1]->orders)); // $this->assertEquals(2, count($customers[1]->orders));
} // }
//
public function testFindLazyVia() // public function testFindLazyVia()
{ // {
/** @var $order Order */ // /** @var $order Order */
$order = Order::find(1); // $order = Order::find(1);
$this->assertEquals(1, $order->id); // $this->assertEquals(1, $order->id);
$this->assertEquals(2, count($order->items)); // $this->assertEquals(2, count($order->items));
$this->assertEquals(1, $order->items[0]->id); // $this->assertEquals(1, $order->items[0]->id);
$this->assertEquals(2, $order->items[1]->id); // $this->assertEquals(2, $order->items[1]->id);
//
$order = Order::find(1); // $order = Order::find(1);
$order->id = 100; // $order->id = 100;
$this->assertEquals(array(), $order->items); // $this->assertEquals(array(), $order->items);
} // }
public function testFindEagerVia() public function testFindEagerVia()
{ {

Loading…
Cancel
Save