Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yii2
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PSDI Army
yii2
Commits
3ca50f30
Commit
3ca50f30
authored
Jan 13, 2013
by
Qiang Xue
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
clean up AR
parent
46ab456f
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
114 additions
and
393 deletions
+114
-393
ActiveRecord.md
docs/api/db/ActiveRecord.md
+9
-0
ModelBehavior.php
framework/base/ModelBehavior.php
+0
-60
ActiveQuery.php
framework/db/ActiveQuery.php
+3
-3
ActiveRecord.php
framework/db/ActiveRecord.php
+13
-23
ActiveRecordBehavior.php
framework/db/ActiveRecordBehavior.php
+0
-102
Customer.php
tests/unit/data/ar/Customer.php
+2
-0
ActiveRecordTest.php
tests/unit/framework/db/ActiveRecordTest.php
+87
-205
No files found.
docs/api/db/ActiveRecord.md
0 → 100644
View file @
3ca50f30
-
`beforeInsert`
. Raised before the record is saved.
By setting
[
[\yii\base\ModelEvent::isValid
]
] to be false, the normal
[
[save()
]
] will be stopped.
-
`afterInsert`
. Raised after the record is saved.
-
`beforeUpdate`
. Raised before the record is saved.
By setting
[
[\yii\base\ModelEvent::isValid
]
] to be false, the normal
[
[save()
]
] will be stopped.
-
`afterUpdate`
. Raised after the record is saved.
-
`beforeDelete`
. Raised before the record is deleted.
By setting
[
[\yii\base\ModelEvent::isValid
]
] to be false, the normal
[
[delete()
]
] process will be stopped.
-
`afterDelete`
. Raised after the record is deleted.
framework/base/ModelBehavior.php
deleted
100644 → 0
View file @
46ab456f
<?php
/**
* ModelBehavior class file.
*
* @link http://www.yiiframework.com/
* @copyright Copyright © 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace
yii\base
;
/**
* ModelBehavior class.
*
* ModelBehavior is a base class for behaviors that are attached to a model object.
* The model should be an instance of [[Model]] or its child classes.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class
ModelBehavior
extends
Behavior
{
/**
* Declares event handlers for the owner's events.
* The default implementation returns the following event handlers:
*
* - `beforeValidate` event
* - `afterValidate` event
*
* You may override these event handler methods to respond to the corresponding owner events.
* @return array events (array keys) and the corresponding event handler methods (array values).
*/
public
function
events
()
{
return
array
(
'beforeValidate'
=>
'beforeValidate'
,
'afterValidate'
=>
'afterValidate'
,
);
}
/**
* Responds to the owner's `beforeValidate` event.
* Override this method if you want to handle the `beforeValidate` event of the [[owner]].
* You may set the [[ModelEvent::isValid|isValid]] property of the event parameter
* to be false to cancel the validation process.
* @param ModelEvent $event event parameter
*/
public
function
beforeValidate
(
$event
)
{
}
/**
* Responds to the owner's `afterValidate` event.
* Override this method if you want to handle the `beforeValidate` event of the [[owner]].
* @param Event $event event parameter
*/
public
function
afterValidate
(
$event
)
{
}
}
framework/db/ActiveQuery.php
View file @
3ca50f30
...
...
@@ -68,7 +68,7 @@ class ActiveQuery extends Query
if
(
$rows
!==
array
())
{
$models
=
$this
->
createModels
(
$rows
);
if
(
!
empty
(
$this
->
with
))
{
$this
->
fetchRelatedModel
s
(
$models
,
$this
->
with
);
$this
->
populateRelation
s
(
$models
,
$this
->
with
);
}
return
$models
;
}
else
{
...
...
@@ -92,7 +92,7 @@ class ActiveQuery extends Query
$model
=
$class
::
create
(
$row
);
if
(
!
empty
(
$this
->
with
))
{
$models
=
array
(
$model
);
$this
->
fetchRelatedModel
s
(
$models
,
$this
->
with
);
$this
->
populateRelation
s
(
$models
,
$this
->
with
);
$model
=
$models
[
0
];
}
return
$model
;
...
...
@@ -216,7 +216,7 @@ class ActiveQuery extends Query
return
$models
;
}
protected
function
fetchRelatedModel
s
(
&
$models
,
$with
)
protected
function
populateRelation
s
(
&
$models
,
$with
)
{
$primaryModel
=
new
$this
->
modelClass
;
$relations
=
$this
->
normalizeRelations
(
$primaryModel
,
$with
);
...
...
framework/db/ActiveRecord.php
View file @
3ca50f30
...
...
@@ -11,9 +11,9 @@
namespace
yii\db
;
use
yii\base\Model
;
use
yii\base\Event
;
use
yii\base\ModelEvent
;
use
yii\base\BadMethodException
;
use
yii\base\BadParamException
;
use
yii\db\Exception
;
use
yii\db\Connection
;
use
yii\db\TableSchema
;
...
...
@@ -23,23 +23,12 @@ use yii\util\StringHelper;
/**
* ActiveRecord is the base class for classes representing relational data.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
* @include @yii/db/ActiveRecord.md
*
* @property array $attributes attribute values indexed by attribute names
*
* ActiveRecord provides a set of events for further customization:
*
* - `beforeInsert`. Raised before the record is saved.
* By setting [[\yii\base\ModelEvent::isValid]] to be false, the normal [[save()]] will be stopped.
* - `afterInsert`. Raised after the record is saved.
* - `beforeUpdate`. Raised before the record is saved.
* By setting [[\yii\base\ModelEvent::isValid]] to be false, the normal [[save()]] will be stopped.
* - `afterUpdate`. Raised after the record is saved.
* - `beforeDelete`. Raised before the record is deleted.
* By setting [[\yii\base\ModelEvent::isValid]] to be false, the normal [[delete()]] process will be stopped.
* - `afterDelete`. Raised after the record is deleted.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
abstract
class
ActiveRecord
extends
Model
{
...
...
@@ -620,9 +609,6 @@ abstract class ActiveRecord extends Model
*/
public
function
updateCounters
(
$counters
)
{
if
(
$this
->
getIsNewRecord
())
{
throw
new
Exception
(
'The active record cannot be updated because it is new.'
);
}
$this
->
updateAllCounters
(
$counters
,
$this
->
getOldPrimaryKey
(
true
));
foreach
(
$counters
as
$name
=>
$value
)
{
$this
->
_attributes
[
$name
]
+=
$value
;
...
...
@@ -787,7 +773,8 @@ abstract class ActiveRecord extends Model
/**
* Creates an active record with the given attributes.
* Note that this method does not save the record into database.
* This method is called by [[ActiveQuery]] to populate the query results
* into Active Records.
* @param array $row attribute values (name => value)
* @return ActiveRecord the newly created active record.
*/
...
...
@@ -833,9 +820,12 @@ abstract class ActiveRecord extends Model
}
/**
* @param string $name
* @return ActiveRelation
* @throws Exception
* Returns the relation object with the specified name.
* A relation is defined by a getter method which returns an [[ActiveRelation]] object.
* It can be declared in either the Active Record class itself or one of its behaviors.
* @param string $name the relation name
* @return ActiveRelation the relation object
* @throws BadParamException if the named relation does not exist.
*/
public
function
getRelation
(
$name
)
{
...
...
@@ -847,7 +837,7 @@ abstract class ActiveRecord extends Model
}
}
catch
(
BadMethodException
$e
)
{
}
throw
new
Exception
(
'Unknown relation: '
.
$name
);
throw
new
BadParamException
(
get_class
(
$this
)
.
' has no relation named "'
.
$name
.
'".'
);
}
/**
...
...
framework/db/ActiveRecordBehavior.php
deleted
100644 → 0
View file @
46ab456f
<?php
/**
* ActiveRecordBehavior class file.
*
* @link http://www.yiiframework.com/
* @copyright Copyright © 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace
yii\db
;
use
yii\base\ModelBehavior
;
/**
* ActiveRecordBehavior is the base class for behaviors that can be attached to [[ActiveRecord]].
*
* Compared to [[\yii\base\ModelBehavior]], ActiveRecordBehavior responds to more events
* that are specific to [[ActiveRecord]].
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class
ActiveRecordBehavior
extends
ModelBehavior
{
/**
* Declares events and the corresponding event handler methods.
* If you override this method, make sure you merge the parent result to the return value.
* @return array events (array keys) and the corresponding event handler methods (array values).
* @see \yii\base\Behavior::events()
*/
public
function
events
()
{
return
array_merge
(
parent
::
events
(),
array
(
'beforeInsert'
=>
'beforeInsert'
,
'afterInsert'
=>
'afterInsert'
,
'beforeUpdate'
=>
'beforeUpdate'
,
'afterUpdate'
=>
'afterUpdate'
,
'beforeDelete'
=>
'beforeDelete'
,
'afterDelete'
=>
'afterDelete'
,
));
}
/**
* Responds to the owner's `beforeInsert` event.
* Overrides this method if you want to handle the corresponding event of the owner.
* You may set the [[ModelEvent::isValid|isValid]] property of the event parameter
* to be false to quit the ActiveRecord inserting process.
* @param \yii\base\ModelEvent $event event parameter
*/
public
function
beforeInsert
(
$event
)
{
}
/**
* Responds to the owner's `afterInsert` event.
* Overrides this method if you want to handle the corresponding event of the owner.
* @param \yii\base\ModelEvent $event event parameter
*/
public
function
afterInsert
(
$event
)
{
}
/**
* Responds to the owner's `beforeUpdate` event.
* Overrides this method if you want to handle the corresponding event of the owner.
* You may set the [[ModelEvent::isValid|isValid]] property of the event parameter
* to be false to quit the ActiveRecord updating process.
* @param \yii\base\ModelEvent $event event parameter
*/
public
function
beforeUpdate
(
$event
)
{
}
/**
* Responds to the owner's `afterUpdate` event.
* Overrides this method if you want to handle the corresponding event of the owner.
* @param \yii\base\ModelEvent $event event parameter
*/
public
function
afterUpdate
(
$event
)
{
}
/**
* Responds to the owner's `beforeDelete` event.
* Overrides this method if you want to handle the corresponding event of the owner.
* You may set the [[ModelEvent::isValid|isValid]] property of the event parameter
* to be false to quit the ActiveRecord deleting process.
* @param \yii\base\ModelEvent $event event parameter
*/
public
function
beforeDelete
(
$event
)
{
}
/**
* Responds to the owner's `afterDelete` event.
* Overrides this method if you want to handle the corresponding event of the owner.
* @param \yii\base\ModelEvent $event event parameter
*/
public
function
afterDelete
(
$event
)
{
}
}
tests/unit/data/ar/Customer.php
View file @
3ca50f30
...
...
@@ -8,6 +8,8 @@ class Customer extends ActiveRecord
const
STATUS_ACTIVE
=
1
;
const
STATUS_INACTIVE
=
2
;
public
$status2
;
public
static
function
tableName
()
{
return
'tbl_customer'
;
...
...
tests/unit/framework/db/ActiveRecordTest.php
View file @
3ca50f30
...
...
@@ -49,6 +49,11 @@ class ActiveRecordTest extends \yiiunit\MysqlTestCase
$this
->
assertTrue
(
$customer
instanceof
Customer
);
$this
->
assertEquals
(
2
,
$customer
->
id
);
// find custom column
$customer
=
Customer
::
find
()
->
select
(
array
(
'*'
,
'(status*2) AS status2'
))
->
where
(
array
(
'name'
=>
'user3'
))
->
one
();
$this
->
assertEquals
(
3
,
$customer
->
id
);
$this
->
assertEquals
(
4
,
$customer
->
status2
);
// find count
$this
->
assertEquals
(
3
,
Customer
::
count
()
->
value
());
...
...
@@ -271,210 +276,86 @@ class ActiveRecordTest extends \yiiunit\MysqlTestCase
$this
->
assertEquals
(
1
,
count
(
$order
->
orderItems
));
}
// public function testInsert()
// {
// $customer = new Customer;
// $customer->email = 'user4@example.com';
// $customer->name = 'user4';
// $customer->address = 'address4';
//
// $this->assertNull($customer->id);
// $this->assertTrue($customer->isNewRecord);
//
// $customer->save();
//
// $this->assertEquals(4, $customer->id);
// $this->assertFalse($customer->isNewRecord);
// }
//
// public function testUpdate()
// {
// // save
// $customer = Customer::find(2);
// $this->assertTrue($customer instanceof Customer);
// $this->assertEquals('user2', $customer->name);
// $this->assertFalse($customer->isNewRecord);
// $customer->name = 'user2x';
// $customer->save();
// $this->assertEquals('user2x', $customer->name);
// $this->assertFalse($customer->isNewRecord);
// $customer2 = Customer::find(2);
// $this->assertEquals('user2x', $customer2->name);
//
// // updateCounters
// $pk = array('order_id' => 2, 'item_id' => 4);
// $orderItem = OrderItem::find()->where($pk)->one();
// $this->assertEquals(1, $orderItem->quantity);
// $ret = $orderItem->updateCounters(array('quantity' => -1));
// $this->assertTrue($ret);
// $this->assertEquals(0, $orderItem->quantity);
// $orderItem = OrderItem::find()->where($pk)->one();
// $this->assertEquals(0, $orderItem->quantity);
//
// // updateAll
// $customer = Customer::find(3);
// $this->assertEquals('user3', $customer->name);
// $ret = Customer::updateAll(array(
// 'name' => 'temp',
// ), array('id' => 3));
// $this->assertEquals(1, $ret);
// $customer = Customer::find(3);
// $this->assertEquals('temp', $customer->name);
//
// // updateCounters
// $pk = array('order_id' => 1, 'item_id' => 2);
// $orderItem = OrderItem::find()->where($pk)->one();
// $this->assertEquals(2, $orderItem->quantity);
// $ret = OrderItem::updateAllCounters(array(
// 'quantity' => 3,
// ), $pk);
// $this->assertEquals(1, $ret);
// $orderItem = OrderItem::find()->where($pk)->one();
// $this->assertEquals(5, $orderItem->quantity);
// }
//
// public function testDelete()
// {
// // delete
// $customer = Customer::find(2);
// $this->assertTrue($customer instanceof Customer);
// $this->assertEquals('user2', $customer->name);
// $customer->delete();
// $customer = Customer::find(2);
// $this->assertNull($customer);
//
// // deleteAll
// $customers = Customer::find()->all();
// $this->assertEquals(2, count($customers));
// $ret = Customer::deleteAll();
// $this->assertEquals(2, $ret);
// $customers = Customer::find()->all();
// $this->assertEquals(0, count($customers));
// }
//
// public function testFind()
// {
// // find one
// $result = Customer::find();
// $this->assertTrue($result instanceof ActiveQuery);
// $customer = $result->one();
// $this->assertTrue($customer instanceof Customer);
// $this->assertEquals(1, $result->count);
//
// // find all
// $result = Customer::find();
// $customers = $result->all();
// $this->assertTrue(is_array($customers));
// $this->assertEquals(3, count($customers));
// $this->assertTrue($customers[0] instanceof Customer);
// $this->assertTrue($customers[1] instanceof Customer);
// $this->assertTrue($customers[2] instanceof Customer);
// $this->assertEquals(3, $result->count);
// $this->assertEquals(3, count($result));
//
// // check count first
// $result = Customer::find();
// $this->assertEquals(3, $result->count);
// $customer = $result->one();
// $this->assertTrue($customer instanceof Customer);
// $this->assertEquals(3, $result->count);
//
// // iterator
// $result = Customer::find();
// $count = 0;
// foreach ($result as $customer) {
// $this->assertTrue($customer instanceof Customer);
// $count++;
// }
// $this->assertEquals($count, $result->count);
//
// // array access
// $result = Customer::find();
// $this->assertTrue($result[0] instanceof Customer);
// $this->assertTrue($result[1] instanceof Customer);
// $this->assertTrue($result[2] instanceof Customer);
//
// // find by a single primary key
// $customer = Customer::find(2);
// $this->assertTrue($customer instanceof Customer);
// $this->assertEquals('user2', $customer->name);
//
// // find by attributes
// $customer = Customer::find()->where(array('name' => 'user2'))->one();
// $this->assertTrue($customer instanceof Customer);
// $this->assertEquals(2, $customer->id);
//
// // find by Query
// $query = array(
// 'where' => 'id=:id',
// 'params' => array(':id' => 2),
// );
// $customer = Customer::find($query)->one();
// $this->assertTrue($customer instanceof Customer);
// $this->assertEquals('user2', $customer->name);
//
// // find count
// $this->assertEquals(3, Customer::find()->count());
// $this->assertEquals(3, Customer::count());
// $this->assertEquals(2, Customer::count(array(
// 'where' => 'id=1 OR id=2',
// )));
// }
//
// public function testFindBySql()
// {
// // find one
// $customer = Customer::findBySql('SELECT * FROM tbl_customer ORDER BY id DESC')->one();
// $this->assertTrue($customer instanceof Customer);
// $this->assertEquals('user3', $customer->name);
//
// // find all
// $customers = Customer::findBySql('SELECT * FROM tbl_customer')->all();
// $this->assertEquals(3, count($customers));
//
// // find with parameter binding
// $customer = Customer::findBySql('SELECT * FROM tbl_customer WHERE id=:id', array(':id' => 2))->one();
// $this->assertTrue($customer instanceof Customer);
// $this->assertEquals('user2', $customer->name);
//
// // count
// $query = Customer::findBySql('SELECT * FROM tbl_customer ORDER BY id DESC');
// $query->one();
// $this->assertEquals(3, $query->count);
// $query = Customer::findBySql('SELECT * FROM tbl_customer ORDER BY id DESC');
// $this->assertEquals(3, $query->count);
// }
//
// public function testQueryMethods()
// {
// $customer = Customer::find()->where('id=:id', array(':id' => 2))->one();
// $this->assertTrue($customer instanceof Customer);
// $this->assertEquals('user2', $customer->name);
//
// $customer = Customer::find()->where(array('name' => 'user3'))->one();
// $this->assertTrue($customer instanceof Customer);
// $this->assertEquals('user3', $customer->name);
//
// $customer = Customer::find()->select('id')->orderBy('id DESC')->one();
// $this->assertTrue($customer instanceof Customer);
// $this->assertEquals(3, $customer->id);
// $this->assertEquals(null, $customer->name);
//
// // scopes
// $customers = Customer::find()->active()->all();
// $this->assertEquals(2, count($customers));
// $customers = Customer::find(array(
// 'scopes' => array('active'),
// ))->all();
// $this->assertEquals(2, count($customers));
//
// // asArray
// $customers = Customer::find()->orderBy('id')->asArray()->all();
// $this->assertEquals('user2', $customers[1]['name']);
//
// // index
// $customers = Customer::find()->orderBy('id')->index('name')->all();
// $this->assertEquals(2, $customers['user2']['id']);
// }
public
function
testInsert
()
{
$customer
=
new
Customer
;
$customer
->
email
=
'user4@example.com'
;
$customer
->
name
=
'user4'
;
$customer
->
address
=
'address4'
;
$this
->
assertNull
(
$customer
->
id
);
$this
->
assertTrue
(
$customer
->
isNewRecord
);
$customer
->
save
();
$this
->
assertEquals
(
4
,
$customer
->
id
);
$this
->
assertFalse
(
$customer
->
isNewRecord
);
}
public
function
testUpdate
()
{
// save
$customer
=
Customer
::
find
(
2
);
$this
->
assertTrue
(
$customer
instanceof
Customer
);
$this
->
assertEquals
(
'user2'
,
$customer
->
name
);
$this
->
assertFalse
(
$customer
->
isNewRecord
);
$customer
->
name
=
'user2x'
;
$customer
->
save
();
$this
->
assertEquals
(
'user2x'
,
$customer
->
name
);
$this
->
assertFalse
(
$customer
->
isNewRecord
);
$customer2
=
Customer
::
find
(
2
);
$this
->
assertEquals
(
'user2x'
,
$customer2
->
name
);
// updateCounters
$pk
=
array
(
'order_id'
=>
2
,
'item_id'
=>
4
);
$orderItem
=
OrderItem
::
find
(
$pk
);
$this
->
assertEquals
(
1
,
$orderItem
->
quantity
);
$ret
=
$orderItem
->
updateCounters
(
array
(
'quantity'
=>
-
1
));
$this
->
assertTrue
(
$ret
);
$this
->
assertEquals
(
0
,
$orderItem
->
quantity
);
$orderItem
=
OrderItem
::
find
(
$pk
);
$this
->
assertEquals
(
0
,
$orderItem
->
quantity
);
// updateAll
$customer
=
Customer
::
find
(
3
);
$this
->
assertEquals
(
'user3'
,
$customer
->
name
);
$ret
=
Customer
::
updateAll
(
array
(
'name'
=>
'temp'
,
),
array
(
'id'
=>
3
));
$this
->
assertEquals
(
1
,
$ret
);
$customer
=
Customer
::
find
(
3
);
$this
->
assertEquals
(
'temp'
,
$customer
->
name
);
// updateCounters
$pk
=
array
(
'order_id'
=>
1
,
'item_id'
=>
2
);
$orderItem
=
OrderItem
::
find
(
$pk
);
$this
->
assertEquals
(
2
,
$orderItem
->
quantity
);
$ret
=
OrderItem
::
updateAllCounters
(
array
(
'quantity'
=>
3
,
'subtotal'
=>
-
10
,
),
$pk
);
$this
->
assertEquals
(
1
,
$ret
);
$orderItem
=
OrderItem
::
find
(
$pk
);
$this
->
assertEquals
(
5
,
$orderItem
->
quantity
);
$this
->
assertEquals
(
30
,
$orderItem
->
subtotal
);
}
public
function
testDelete
()
{
// delete
$customer
=
Customer
::
find
(
2
);
$this
->
assertTrue
(
$customer
instanceof
Customer
);
$this
->
assertEquals
(
'user2'
,
$customer
->
name
);
$customer
->
delete
();
$customer
=
Customer
::
find
(
2
);
$this
->
assertNull
(
$customer
);
// deleteAll
$customers
=
Customer
::
find
()
->
all
();
$this
->
assertEquals
(
2
,
count
(
$customers
));
$ret
=
Customer
::
deleteAll
();
$this
->
assertEquals
(
2
,
$ret
);
$customers
=
Customer
::
find
()
->
all
();
$this
->
assertEquals
(
0
,
count
(
$customers
));
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment