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
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Rotua Panjaitan
yii2
Commits
f7bc1060
Commit
f7bc1060
authored
Jun 02, 2014
by
Alexander Makarov
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'NmDimas-unlinkAll'
parents
ceb2689f
46247939
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
345 additions
and
5 deletions
+345
-5
CHANGELOG.md
framework/CHANGELOG.md
+2
-1
BaseActiveRecord.php
framework/db/BaseActiveRecord.php
+61
-0
Customer.php
tests/unit/data/ar/Customer.php
+4
-0
Order.php
tests/unit/data/ar/Order.php
+13
-0
OrderItemWithNullFK.php
tests/unit/data/ar/OrderItemWithNullFK.php
+20
-0
OrderWithNullFK.php
tests/unit/data/ar/OrderWithNullFK.php
+21
-0
cubrid.sql
tests/unit/data/cubrid.sql
+28
-0
mssql.sql
tests/unit/data/mssql.sql
+26
-0
mysql.sql
tests/unit/data/mysql.sql
+29
-0
postgres.sql
tests/unit/data/postgres.sql
+27
-0
sqlite.sql
tests/unit/data/sqlite.sql
+28
-0
ActiveRecordTestTrait.php
tests/unit/framework/ar/ActiveRecordTestTrait.php
+75
-4
ActiveRecordTest.php
tests/unit/framework/db/ActiveRecordTest.php
+11
-0
No files found.
framework/CHANGELOG.md
View file @
f7bc1060
...
...
@@ -60,7 +60,8 @@ Yii Framework 2 Change Log
-
Enh #3328:
`BaseMailer`
generates better text body from html body (armab)
-
Enh #3380: Allow
`value`
in
`defaultValueValidator`
to be a closure (Alex-Code)
-
Enh #3472: Added configurable option to encode spaces in dropDownLists and listBoxes (kartik-v)
-
Enh #3518:
`yii\helpers\Html::encode()`
now replaces invalid code sequences with "?" (DaSourcerer)
-
Enh #3518:
`yii\helpers\Html::encode()`
now replaces invalid code sequences with "�" (DaSourcerer)
-
Enh #3520 Added Unlink all relationship in current model (NmDimas)
-
Enh #3521: Added
`yii\filters\HttpCache::sessionCacheLimiter`
(qiangxue)
-
Enh #3542: Removed requirement to specify
`extensions`
in application config (samdark)
-
Enh #3562: Adding rotateByCopy to yii
\l
og
\F
ileTarget (pawzar)
...
...
framework/db/BaseActiveRecord.php
View file @
f7bc1060
...
...
@@ -1284,6 +1284,67 @@ abstract class BaseActiveRecord extends Model implements ActiveRecordInterface
}
/**
* Destroys the relationship in current model.
*
* The model with the foreign key of the relationship will be deleted if `$delete` is true.
* Otherwise, the foreign key will be set null and the model will be saved without validation.
*
* Note to destroy the relationship without removing records make sure your keys can be set to null
*
* @param string $name the case sensitive name of the relationship.
* @param boolean $delete whether to delete the model that contains the foreign key.
*/
public
function
unlinkAll
(
$name
,
$delete
=
false
)
{
$relation
=
$this
->
getRelation
(
$name
);
/** @var Command $command */
$command
=
static
::
getDb
()
->
createCommand
();
$columns
=
[];
$condition
=
[];
if
(
empty
(
$relation
->
via
))
{
/** @var $viaClass \yii\db\ActiveRecord */
$viaClass
=
$relation
->
modelClass
;
if
(
$delete
)
{
foreach
(
$relation
->
link
as
$a
=>
$b
)
{
$condition
[
$a
]
=
$this
->
$b
;
}
$command
->
delete
(
$viaClass
::
tableName
(),
$condition
)
->
execute
();
}
else
{
foreach
(
$relation
->
link
as
$a
=>
$b
)
{
$columns
[
$a
]
=
null
;
$condition
[
$a
]
=
$this
->
$b
;
}
$command
->
update
(
$viaClass
::
tableName
(),
$columns
,
$condition
)
->
execute
();
}
}
else
{
$viaTable
=
$viaTable
=
reset
(
$relation
->
via
->
from
);
/** @var ActiveQuery $viaRelation */
$viaRelation
=
$relation
->
via
;
if
(
$delete
)
{
foreach
(
$viaRelation
->
link
as
$a
=>
$b
)
{
$condition
[
$a
]
=
$this
->
$b
;
}
$command
->
delete
(
$viaTable
,
$condition
)
->
execute
();
}
else
{
foreach
(
$viaRelation
->
link
as
$a
=>
$b
)
{
$columns
[
$a
]
=
null
;
$condition
[
$a
]
=
$this
->
$b
;
}
$command
->
update
(
$viaTable
,
$columns
,
$condition
)
->
execute
();
}
}
if
(
!
$relation
->
multiple
)
{
unset
(
$this
->
_related
[
$name
]);
}
elseif
(
isset
(
$this
->
_related
[
$name
]))
{
/** @var ActiveRecordInterface $b */
foreach
(
array_keys
(
$this
->
_related
[
$name
])
as
$a
)
{
unset
(
$this
->
_related
[
$name
][
$a
]);
}
}
}
/**
* @param array $link
* @param ActiveRecordInterface $foreignModel
* @param ActiveRecordInterface $primaryModel
...
...
tests/unit/data/ar/Customer.php
View file @
f7bc1060
...
...
@@ -36,6 +36,10 @@ class Customer extends ActiveRecord
{
return
$this
->
hasMany
(
Order
::
className
(),
[
'customer_id'
=>
'id'
])
->
orderBy
(
'id'
);
}
public
function
getOrdersWithNullFK
()
{
return
$this
->
hasMany
(
OrderWithNullFK
::
className
(),
[
'customer_id'
=>
'id'
])
->
orderBy
(
'id'
);
}
public
function
getOrders2
()
{
...
...
tests/unit/data/ar/Order.php
View file @
f7bc1060
...
...
@@ -40,6 +40,12 @@ class Order extends ActiveRecord
})
->
orderBy
(
'item.id'
);
}
public
function
getItemsWithNullFK
()
{
return
$this
->
hasMany
(
Item
::
className
(),
[
'id'
=>
'item_id'
])
->
viaTable
(
'order_item_with_null_fk'
,
[
'order_id'
=>
'id'
]);
}
public
function
getItemsInOrder1
()
{
return
$this
->
hasMany
(
Item
::
className
(),
[
'id'
=>
'item_id'
])
...
...
@@ -63,6 +69,13 @@ class Order extends ActiveRecord
->
where
([
'category_id'
=>
1
]);
}
public
function
getBooksWithNullFK
()
{
return
$this
->
hasMany
(
Item
::
className
(),
[
'id'
=>
'item_id'
])
->
viaTable
(
'order_item_with_null_fk'
,
[
'order_id'
=>
'id'
])
->
where
([
'category_id'
=>
1
]);
}
public
function
getBooks2
()
{
return
$this
->
hasMany
(
Item
::
className
(),
[
'id'
=>
'item_id'
])
...
...
tests/unit/data/ar/OrderItemWithNullFK.php
0 → 100644
View file @
f7bc1060
<?php
namespace
yiiunit\data\ar
;
/**
* Class OrderItem
*
* @property integer $order_id
* @property integer $item_id
* @property integer $quantity
* @property string $subtotal
*/
class
OrderItemWithNullFK
extends
ActiveRecord
{
public
static
function
tableName
()
{
return
'order_item_with_null_fk'
;
}
}
tests/unit/data/ar/OrderWithNullFK.php
0 → 100644
View file @
f7bc1060
<?php
namespace
yiiunit\data\ar
;
/**
* Class Order
*
* @property integer $id
* @property integer $customer_id
* @property integer $created_at
* @property string $total
*/
class
OrderWithNullFK
extends
ActiveRecord
{
public
static
function
tableName
()
{
return
'order_with_null_fk'
;
}
}
tests/unit/data/cubrid.sql
View file @
f7bc1060
...
...
@@ -5,8 +5,10 @@
DROP
TABLE
IF
EXISTS
`composite_fk`
;
DROP
TABLE
IF
EXISTS
`order_item`
;
DROP
TABLE
IF
EXISTS
`order_item_with_null_fk`
;
DROP
TABLE
IF
EXISTS
`item`
;
DROP
TABLE
IF
EXISTS
`order`
;
DROP
TABLE
IF
EXISTS
`order_with_null_fk`
;
DROP
TABLE
IF
EXISTS
`category`
;
DROP
TABLE
IF
EXISTS
`customer`
;
DROP
TABLE
IF
EXISTS
`profile`
;
...
...
@@ -60,6 +62,14 @@ CREATE TABLE `order` (
CONSTRAINT
`FK_order_customer_id`
FOREIGN
KEY
(
`customer_id`
)
REFERENCES
`customer`
(
`id`
)
ON
DELETE
CASCADE
);
CREATE
TABLE
`order_with_null_fk`
(
`id`
int
(
11
)
NOT
NULL
AUTO_INCREMENT
,
`customer_id`
int
(
11
),
`created_at`
int
(
11
)
NOT
NULL
,
`total`
decimal
(
10
,
0
)
NOT
NULL
,
PRIMARY
KEY
(
`id`
)
);
CREATE
TABLE
`order_item`
(
`order_id`
int
(
11
)
NOT
NULL
,
`item_id`
int
(
11
)
NOT
NULL
,
...
...
@@ -70,6 +80,13 @@ CREATE TABLE `order_item` (
CONSTRAINT
`FK_order_item_item_id`
FOREIGN
KEY
(
`item_id`
)
REFERENCES
`item`
(
`id`
)
ON
DELETE
CASCADE
);
CREATE
TABLE
`order_item_with_null_fk`
(
`order_id`
int
(
11
),
`item_id`
int
(
11
),
`quantity`
int
(
11
)
NOT
NULL
,
`subtotal`
decimal
(
10
,
0
)
NOT
NULL
);
CREATE
TABLE
null_values
(
`id`
INT
(
11
)
NOT
NULL
AUTO_INCREMENT
,
`var1`
INT
NULL
,
...
...
@@ -124,9 +141,20 @@ INSERT INTO `order` (customer_id, created_at, total) VALUES (1, 1325282384, 110.
INSERT
INTO
`order`
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325334482
,
33
.
0
);
INSERT
INTO
`order`
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325502201
,
40
.
0
);
INSERT
INTO
`order_with_null_fk`
(
customer_id
,
created_at
,
total
)
VALUES
(
1
,
1325282384
,
110
.
0
);
INSERT
INTO
`order_with_null_fk`
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325334482
,
33
.
0
);
INSERT
INTO
`order_with_null_fk`
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325502201
,
40
.
0
);
INSERT
INTO
`order_item`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
1
,
1
,
30
.
0
);
INSERT
INTO
`order_item`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
2
,
2
,
40
.
0
);
INSERT
INTO
`order_item`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
4
,
1
,
10
.
0
);
INSERT
INTO
`order_item`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
5
,
1
,
15
.
0
);
INSERT
INTO
`order_item`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
3
,
1
,
8
.
0
);
INSERT
INTO
`order_item`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
3
,
2
,
1
,
40
.
0
);
INSERT
INTO
`order_item_with_null_fk`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
1
,
1
,
30
.
0
);
INSERT
INTO
`order_item_with_null_fk`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
2
,
2
,
40
.
0
);
INSERT
INTO
`order_item_with_null_fk`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
4
,
1
,
10
.
0
);
INSERT
INTO
`order_item_with_null_fk`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
5
,
1
,
15
.
0
);
INSERT
INTO
`order_item_with_null_fk`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
3
,
1
,
8
.
0
);
INSERT
INTO
`order_item_with_null_fk`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
3
,
2
,
1
,
40
.
0
);
tests/unit/data/mssql.sql
View file @
f7bc1060
IF
OBJECT_ID
(
'[dbo].[order_item]'
,
'U'
)
IS
NOT
NULL
DROP
TABLE
[
dbo
].[
order_item
];
IF
OBJECT_ID
(
'[dbo].[order_item_with_null_fk]'
,
'U'
)
IS
NOT
NULL
DROP
TABLE
[
dbo
].[
order_item_with_null_fk
];
IF
OBJECT_ID
(
'[dbo].[item]'
,
'U'
)
IS
NOT
NULL
DROP
TABLE
[
dbo
].[
item
];
IF
OBJECT_ID
(
'[dbo].[order]'
,
'U'
)
IS
NOT
NULL
DROP
TABLE
[
dbo
].[
order
];
IF
OBJECT_ID
(
'[dbo].[order_with_null_fk]'
,
'U'
)
IS
NOT
NULL
DROP
TABLE
[
dbo
].[
order_with_null_fk
];
IF
OBJECT_ID
(
'[dbo].[category]'
,
'U'
)
IS
NOT
NULL
DROP
TABLE
[
dbo
].[
category
];
IF
OBJECT_ID
(
'[dbo].[customer]'
,
'U'
)
IS
NOT
NULL
DROP
TABLE
[
dbo
].[
customer
];
IF
OBJECT_ID
(
'[dbo].[profile]'
,
'U'
)
IS
NOT
NULL
DROP
TABLE
[
dbo
].[
profile
];
...
...
@@ -54,6 +56,13 @@ CREATE TABLE [dbo].[order] (
)
ON
[
PRIMARY
]
);
CREATE
TABLE
[
dbo
].[
order_with_null_fk
]
(
[
id
]
[
int
]
IDENTITY
(
1
,
1
)
NOT
NULL
,
[
customer_id
]
[
int
]
,
[
created_at
]
[
int
]
NOT
NULL
,
[
total
]
[
decimal
](
10
,
0
)
NOT
NULL
);
CREATE
TABLE
[
dbo
].[
order_item
]
(
[
order_id
]
[
int
]
NOT
NULL
,
[
item_id
]
[
int
]
NOT
NULL
,
...
...
@@ -63,6 +72,12 @@ CREATE TABLE [dbo].[order_item] (
[
order_id
]
ASC
,
[
item_id
]
ASC
)
ON
[
PRIMARY
]
);
CREATE
TABLE
[
dbo
].[
order_item_with_null_fk
]
(
[
order_id
]
[
int
],
[
item_id
]
[
int
],
[
quantity
]
[
int
]
NOT
NULL
,
[
subtotal
]
[
decimal
](
10
,
0
)
NOT
NULL
);
CREATE
TABLE
[
dbo
].[
null_values
]
(
...
...
@@ -109,9 +124,20 @@ INSERT INTO [dbo].[order] ([customer_id], [created_at], [total]) VALUES (1, 1325
INSERT
INTO
[
dbo
].[
order
]
([
customer_id
],
[
created_at
],
[
total
])
VALUES
(
2
,
1325334482
,
33
.
0
);
INSERT
INTO
[
dbo
].[
order
]
([
customer_id
],
[
created_at
],
[
total
])
VALUES
(
2
,
1325502201
,
40
.
0
);
INSERT
INTO
[
dbo
].[
order_with_null_fk
]
([
customer_id
],
[
created_at
],
[
total
])
VALUES
(
1
,
1325282384
,
110
.
0
);
INSERT
INTO
[
dbo
].[
order_with_null_fk
]
([
customer_id
],
[
created_at
],
[
total
])
VALUES
(
2
,
1325334482
,
33
.
0
);
INSERT
INTO
[
dbo
].[
order_with_null_fk
]
([
customer_id
],
[
created_at
],
[
total
])
VALUES
(
2
,
1325502201
,
40
.
0
);
INSERT
INTO
[
dbo
].[
order_item
]
([
order_id
],
[
item_id
],
[
quantity
],
[
subtotal
])
VALUES
(
1
,
1
,
1
,
30
.
0
);
INSERT
INTO
[
dbo
].[
order_item
]
([
order_id
],
[
item_id
],
[
quantity
],
[
subtotal
])
VALUES
(
1
,
2
,
2
,
40
.
0
);
INSERT
INTO
[
dbo
].[
order_item
]
([
order_id
],
[
item_id
],
[
quantity
],
[
subtotal
])
VALUES
(
2
,
4
,
1
,
10
.
0
);
INSERT
INTO
[
dbo
].[
order_item
]
([
order_id
],
[
item_id
],
[
quantity
],
[
subtotal
])
VALUES
(
2
,
5
,
1
,
15
.
0
);
INSERT
INTO
[
dbo
].[
order_item
]
([
order_id
],
[
item_id
],
[
quantity
],
[
subtotal
])
VALUES
(
2
,
3
,
1
,
8
.
0
);
INSERT
INTO
[
dbo
].[
order_item
]
([
order_id
],
[
item_id
],
[
quantity
],
[
subtotal
])
VALUES
(
3
,
2
,
1
,
40
.
0
);
INSERT
INTO
[
dbo
].[
order_item_with_null_fk
]
([
order_id
],
[
item_id
],
[
quantity
],
[
subtotal
])
VALUES
(
1
,
1
,
1
,
30
.
0
);
INSERT
INTO
[
dbo
].[
order_item_with_null_fk
]
([
order_id
],
[
item_id
],
[
quantity
],
[
subtotal
])
VALUES
(
1
,
2
,
2
,
40
.
0
);
INSERT
INTO
[
dbo
].[
order_item_with_null_fk
]
([
order_id
],
[
item_id
],
[
quantity
],
[
subtotal
])
VALUES
(
2
,
4
,
1
,
10
.
0
);
INSERT
INTO
[
dbo
].[
order_item_with_null_fk
]
([
order_id
],
[
item_id
],
[
quantity
],
[
subtotal
])
VALUES
(
2
,
5
,
1
,
15
.
0
);
INSERT
INTO
[
dbo
].[
order_item_with_null_fk
]
([
order_id
],
[
item_id
],
[
quantity
],
[
subtotal
])
VALUES
(
2
,
3
,
1
,
8
.
0
);
INSERT
INTO
[
dbo
].[
order_item_with_null_fk
]
([
order_id
],
[
item_id
],
[
quantity
],
[
subtotal
])
VALUES
(
3
,
2
,
1
,
40
.
0
);
tests/unit/data/mysql.sql
View file @
f7bc1060
...
...
@@ -5,8 +5,10 @@
DROP
TABLE
IF
EXISTS
`composite_fk`
CASCADE
;
DROP
TABLE
IF
EXISTS
`order_item`
CASCADE
;
DROP
TABLE
IF
EXISTS
`order_item_with_null_fk`
CASCADE
;
DROP
TABLE
IF
EXISTS
`item`
CASCADE
;
DROP
TABLE
IF
EXISTS
`order`
CASCADE
;
DROP
TABLE
IF
EXISTS
`order_with_null_fk`
CASCADE
;
DROP
TABLE
IF
EXISTS
`category`
CASCADE
;
DROP
TABLE
IF
EXISTS
`customer`
CASCADE
;
DROP
TABLE
IF
EXISTS
`profile`
CASCADE
;
...
...
@@ -61,6 +63,14 @@ CREATE TABLE `order` (
CONSTRAINT
`FK_order_customer_id`
FOREIGN
KEY
(
`customer_id`
)
REFERENCES
`customer`
(
`id`
)
ON
DELETE
CASCADE
)
ENGINE
=
InnoDB
DEFAULT
CHARSET
=
utf8
;
CREATE
TABLE
`order_with_null_fk`
(
`id`
int
(
11
)
NOT
NULL
AUTO_INCREMENT
,
`customer_id`
int
(
11
),
`created_at`
int
(
11
)
NOT
NULL
,
`total`
decimal
(
10
,
0
)
NOT
NULL
,
PRIMARY
KEY
(
`id`
)
)
ENGINE
=
InnoDB
DEFAULT
CHARSET
=
utf8
;
CREATE
TABLE
`order_item`
(
`order_id`
int
(
11
)
NOT
NULL
,
`item_id`
int
(
11
)
NOT
NULL
,
...
...
@@ -72,6 +82,14 @@ CREATE TABLE `order_item` (
CONSTRAINT
`FK_order_item_item_id`
FOREIGN
KEY
(
`item_id`
)
REFERENCES
`item`
(
`id`
)
ON
DELETE
CASCADE
)
ENGINE
=
InnoDB
DEFAULT
CHARSET
=
utf8
;
CREATE
TABLE
`order_item_with_null_fk`
(
`order_id`
int
(
11
),
`item_id`
int
(
11
),
`quantity`
int
(
11
)
NOT
NULL
,
`subtotal`
decimal
(
10
,
0
)
NOT
NULL
)
ENGINE
=
InnoDB
DEFAULT
CHARSET
=
utf8
;
CREATE
TABLE
`composite_fk`
(
`id`
int
(
11
)
NOT
NULL
,
`order_id`
int
(
11
)
NOT
NULL
,
...
...
@@ -124,6 +142,10 @@ INSERT INTO `order` (customer_id, created_at, total) VALUES (1, 1325282384, 110.
INSERT
INTO
`order`
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325334482
,
33
.
0
);
INSERT
INTO
`order`
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325502201
,
40
.
0
);
INSERT
INTO
`order_with_null_fk`
(
customer_id
,
created_at
,
total
)
VALUES
(
1
,
1325282384
,
110
.
0
);
INSERT
INTO
`order_with_null_fk`
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325334482
,
33
.
0
);
INSERT
INTO
`order_with_null_fk`
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325502201
,
40
.
0
);
INSERT
INTO
`order_item`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
1
,
1
,
30
.
0
);
INSERT
INTO
`order_item`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
2
,
2
,
40
.
0
);
INSERT
INTO
`order_item`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
4
,
1
,
10
.
0
);
...
...
@@ -131,6 +153,13 @@ INSERT INTO `order_item` (order_id, item_id, quantity, subtotal) VALUES (2, 5, 1
INSERT
INTO
`order_item`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
3
,
1
,
8
.
0
);
INSERT
INTO
`order_item`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
3
,
2
,
1
,
40
.
0
);
INSERT
INTO
`order_item_with_null_fk`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
1
,
1
,
30
.
0
);
INSERT
INTO
`order_item_with_null_fk`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
2
,
2
,
40
.
0
);
INSERT
INTO
`order_item_with_null_fk`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
4
,
1
,
10
.
0
);
INSERT
INTO
`order_item_with_null_fk`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
5
,
1
,
15
.
0
);
INSERT
INTO
`order_item_with_null_fk`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
3
,
1
,
8
.
0
);
INSERT
INTO
`order_item_with_null_fk`
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
3
,
2
,
1
,
40
.
0
);
/**
* (MySQL-)Database Schema for validator tests
...
...
tests/unit/data/postgres.sql
View file @
f7bc1060
...
...
@@ -6,7 +6,9 @@
DROP
TABLE
IF
EXISTS
"order_item"
CASCADE
;
DROP
TABLE
IF
EXISTS
"item"
CASCADE
;
DROP
TABLE
IF
EXISTS
"order_item_with_null_fk"
CASCADE
;
DROP
TABLE
IF
EXISTS
"order"
CASCADE
;
DROP
TABLE
IF
EXISTS
"order_with_null_fk"
CASCADE
;
DROP
TABLE
IF
EXISTS
"category"
CASCADE
;
DROP
TABLE
IF
EXISTS
"customer"
CASCADE
;
DROP
TABLE
IF
EXISTS
"profile"
CASCADE
;
...
...
@@ -54,6 +56,13 @@ CREATE TABLE "order" (
total
decimal
(
10
,
0
)
NOT
NULL
);
CREATE
TABLE
"order_with_null_fk"
(
id
serial
not
null
primary
key
,
customer_id
integer
,
created_at
integer
NOT
NULL
,
total
decimal
(
10
,
0
)
NOT
NULL
);
CREATE
TABLE
"order_item"
(
order_id
integer
NOT
NULL
references
"order"
(
id
)
on
UPDATE
CASCADE
on
DELETE
CASCADE
,
item_id
integer
NOT
NULL
references
"item"
(
id
)
on
UPDATE
CASCADE
on
DELETE
CASCADE
,
...
...
@@ -62,6 +71,13 @@ CREATE TABLE "order_item" (
PRIMARY
KEY
(
order_id
,
item_id
)
);
CREATE
TABLE
"order_item_with_null_fk"
(
order_id
integer
,
item_id
integer
,
quantity
integer
NOT
NULL
,
subtotal
decimal
(
10
,
0
)
NOT
NULL
);
CREATE
TABLE
"null_values"
(
id
INT
NOT
NULL
,
var1
INT
NULL
,
...
...
@@ -106,6 +122,10 @@ INSERT INTO "order" (customer_id, created_at, total) VALUES (1, 1325282384, 110.
INSERT
INTO
"order"
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325334482
,
33
.
0
);
INSERT
INTO
"order"
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325502201
,
40
.
0
);
INSERT
INTO
"order_with_null_fk"
(
customer_id
,
created_at
,
total
)
VALUES
(
1
,
1325282384
,
110
.
0
);
INSERT
INTO
"order_with_null_fk"
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325334482
,
33
.
0
);
INSERT
INTO
"order_with_null_fk"
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325502201
,
40
.
0
);
INSERT
INTO
"order_item"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
1
,
1
,
30
.
0
);
INSERT
INTO
"order_item"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
2
,
2
,
40
.
0
);
INSERT
INTO
"order_item"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
4
,
1
,
10
.
0
);
...
...
@@ -113,6 +133,13 @@ INSERT INTO "order_item" (order_id, item_id, quantity, subtotal) VALUES (2, 5, 1
INSERT
INTO
"order_item"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
3
,
1
,
8
.
0
);
INSERT
INTO
"order_item"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
3
,
2
,
1
,
40
.
0
);
INSERT
INTO
"order_item_with_null_fk"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
1
,
1
,
30
.
0
);
INSERT
INTO
"order_item_with_null_fk"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
2
,
2
,
40
.
0
);
INSERT
INTO
"order_item_with_null_fk"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
4
,
1
,
10
.
0
);
INSERT
INTO
"order_item_with_null_fk"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
5
,
1
,
15
.
0
);
INSERT
INTO
"order_item_with_null_fk"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
3
,
1
,
8
.
0
);
INSERT
INTO
"order_item_with_null_fk"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
3
,
2
,
1
,
40
.
0
);
/**
* (Postgres-)Database Schema for validator tests
*/
...
...
tests/unit/data/sqlite.sql
View file @
f7bc1060
...
...
@@ -5,8 +5,10 @@
DROP
TABLE
IF
EXISTS
"composite_fk"
;
DROP
TABLE
IF
EXISTS
"order_item"
;
DROP
TABLE
IF
EXISTS
"order_item_with_null_fk"
;
DROP
TABLE
IF
EXISTS
"item"
;
DROP
TABLE
IF
EXISTS
"order"
;
DROP
TABLE
IF
EXISTS
"order_with_null_fk"
;
DROP
TABLE
IF
EXISTS
"category"
;
DROP
TABLE
IF
EXISTS
"customer"
;
DROP
TABLE
IF
EXISTS
"profile"
;
...
...
@@ -50,6 +52,14 @@ CREATE TABLE "order" (
PRIMARY
KEY
(
id
)
);
CREATE
TABLE
"order_with_null_fk"
(
id
INTEGER
NOT
NULL
,
customer_id
INTEGER
,
created_at
INTEGER
NOT
NULL
,
total
decimal
(
10
,
0
)
NOT
NULL
,
PRIMARY
KEY
(
id
)
);
CREATE
TABLE
"order_item"
(
order_id
INTEGER
NOT
NULL
,
item_id
INTEGER
NOT
NULL
,
...
...
@@ -58,6 +68,13 @@ CREATE TABLE "order_item" (
PRIMARY
KEY
(
order_id
,
item_id
)
);
CREATE
TABLE
"order_item_with_null_fk"
(
order_id
INTEGER
,
item_id
INTEGER
,
quantity
INTEGER
NOT
NULL
,
subtotal
decimal
(
10
,
0
)
NOT
NULL
,
);
CREATE
TABLE
"composite_fk"
(
id
int
(
11
)
NOT
NULL
,
order_id
int
(
11
)
NOT
NULL
,
...
...
@@ -109,6 +126,10 @@ INSERT INTO "order" (customer_id, created_at, total) VALUES (1, 1325282384, 110.
INSERT
INTO
"order"
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325334482
,
33
.
0
);
INSERT
INTO
"order"
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325502201
,
40
.
0
);
INSERT
INTO
"order_with_null_fk"
(
customer_id
,
created_at
,
total
)
VALUES
(
1
,
1325282384
,
110
.
0
);
INSERT
INTO
"order_with_null_fk"
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325334482
,
33
.
0
);
INSERT
INTO
"order_with_null_fk"
(
customer_id
,
created_at
,
total
)
VALUES
(
2
,
1325502201
,
40
.
0
);
INSERT
INTO
"order_item"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
1
,
1
,
30
.
0
);
INSERT
INTO
"order_item"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
2
,
2
,
40
.
0
);
INSERT
INTO
"order_item"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
4
,
1
,
10
.
0
);
...
...
@@ -116,6 +137,13 @@ INSERT INTO "order_item" (order_id, item_id, quantity, subtotal) VALUES (2, 5, 1
INSERT
INTO
"order_item"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
3
,
1
,
8
.
0
);
INSERT
INTO
"order_item"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
3
,
2
,
1
,
40
.
0
);
INSERT
INTO
"order_item_with_null_fk"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
1
,
1
,
30
.
0
);
INSERT
INTO
"order_item_with_null_fk"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
1
,
2
,
2
,
40
.
0
);
INSERT
INTO
"order_item_with_null_fk"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
4
,
1
,
10
.
0
);
INSERT
INTO
"order_item_with_null_fk"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
5
,
1
,
15
.
0
);
INSERT
INTO
"order_item_with_null_fk"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
2
,
3
,
1
,
8
.
0
);
INSERT
INTO
"order_item_with_null_fk"
(
order_id
,
item_id
,
quantity
,
subtotal
)
VALUES
(
3
,
2
,
1
,
40
.
0
);
/**
* (SqLite-)Database Schema for validator tests
*/
...
...
tests/unit/framework/ar/ActiveRecordTestTrait.php
View file @
f7bc1060
...
...
@@ -678,24 +678,95 @@ trait ActiveRecordTestTrait
$customerClass
=
$this
->
getCustomerClass
();
/** @var \yii\db\ActiveRecordInterface $orderClass */
$orderClass
=
$this
->
getOrderClass
();
/** @var \yii\db\ActiveRecordInterface $orderWithNullFKClass */
$orderWithNullFKClass
=
$this
->
getOrderWithNullFKClass
();
/** @var \yii\db\ActiveRecordInterface $orderItemsWithNullFKClass */
$orderItemsWithNullFKClass
=
$this
->
getOrderIteWithNullFKmClass
();
/** @var TestCase|ActiveRecordTestTrait $this */
// has many
// has many without delete
$customer
=
$customerClass
::
findOne
(
2
);
$this
->
assertEquals
(
2
,
count
(
$customer
->
ordersWithNullFK
));
$customer
->
unlink
(
'ordersWithNullFK'
,
$customer
->
ordersWithNullFK
[
1
],
false
);
$this
->
assertEquals
(
1
,
count
(
$customer
->
ordersWithNullFK
));
$orderWithNullFK
=
$orderWithNullFKClass
::
findOne
(
3
);
$this
->
assertEquals
(
3
,
$orderWithNullFK
->
id
);
$this
->
assertNull
(
$orderWithNullFK
->
customer_id
);
// has many with delete
$customer
=
$customerClass
::
findOne
(
2
);
$this
->
assertEquals
(
2
,
count
(
$customer
->
orders
));
$customer
->
unlink
(
'orders'
,
$customer
->
orders
[
1
],
true
);
$this
->
afterSave
();
$this
->
assertEquals
(
1
,
count
(
$customer
->
orders
));
$this
->
assertNull
(
$orderClass
::
findOne
(
3
));
// via model
// via model
with delete
$order
=
$orderClass
::
findOne
(
2
);
$this
->
assertEquals
(
3
,
count
(
$order
->
items
));
$this
->
assertEquals
(
3
,
count
(
$order
->
orderItems
));
$order
->
unlink
(
'items'
,
$order
->
items
[
2
],
true
);
$this
->
afterSave
();
$this
->
assertEquals
(
2
,
count
(
$order
->
items
));
$this
->
assertEquals
(
2
,
count
(
$order
->
orderItems
));
// via model without delete
$this
->
assertEquals
(
3
,
count
(
$order
->
itemsWithNullFK
));
$order
->
unlink
(
'itemsWithNullFK'
,
$order
->
itemsWithNullFK
[
2
],
false
);
$this
->
assertEquals
(
2
,
count
(
$order
->
itemsWithNullFK
));
$this
->
assertEquals
(
2
,
count
(
$order
->
orderItems
));
}
public
function
testUnlinkAll
()
{
/** @var \yii\db\ActiveRecordInterface $customerClass */
$customerClass
=
$this
->
getCustomerClass
();
/** @var \yii\db\ActiveRecordInterface $orderClass */
$orderClass
=
$this
->
getOrderClass
();
$orderWithNullFKClass
=
$this
->
getOrderWithNullFKClass
();
/** @var \yii\db\ActiveRecordInterface $orderItemsWithNullFKClass */
$orderItemsWithNullFKClass
=
$this
->
getOrderIteWithNullFKmClass
();
/** @var TestCase|ActiveRecordTestTrait $this */
// has many with delete
$customer
=
$customerClass
::
findOne
(
2
);
$this
->
assertEquals
(
2
,
count
(
$customer
->
orders
));
$customer
->
unlinkAll
(
'orders'
,
true
);
$this
->
assertEquals
(
0
,
count
(
$customer
->
orders
));
$this
->
assertNull
(
$orderClass
::
findOne
(
2
));
$this
->
assertNull
(
$orderClass
::
findOne
(
3
));
// has many without delete
$customer
=
$customerClass
::
findOne
(
2
);
$this
->
assertEquals
(
2
,
count
(
$customer
->
ordersWithNullFK
));
$customer
->
unlinkAll
(
'ordersWithNullFK'
,
false
);
$this
->
assertEquals
(
0
,
count
(
$customer
->
ordersWithNullFK
));
$this
->
assertEquals
(
2
,
$orderWithNullFKClass
::
find
()
->
where
(
'(id=2 OR id=3) AND customer_id IS NULL'
)
->
count
());
// via model with delete
/** @var Order $order */
$order
=
$orderClass
::
findOne
(
1
);
$this
->
assertEquals
(
2
,
count
(
$order
->
books
));
$order
->
unlinkAll
(
'books'
,
true
);
$this
->
assertEquals
(
0
,
count
(
$order
->
books
));
// via model without delete
$books
=
$order
->
booksWithNullFK
;
$this
->
assertEquals
(
2
,
count
(
$books
));
$order
->
unlinkAll
(
'booksWithNullFK'
,
false
);
$this
->
assertEquals
(
2
,
$orderItemsWithNullFKClass
::
find
()
->
where
(
'(item_id=1 OR item_id=2) AND order_id IS NULL'
)
->
count
());
}
public
static
$afterSaveNewRecord
;
...
...
tests/unit/framework/db/ActiveRecordTest.php
View file @
f7bc1060
...
...
@@ -7,6 +7,8 @@ use yiiunit\data\ar\NullValues;
use
yiiunit\data\ar\OrderItem
;
use
yiiunit\data\ar\Order
;
use
yiiunit\data\ar\Item
;
use
yiiunit\data\ar\OrderItemWithNullFK
;
use
yiiunit\data\ar\OrderWithNullFK
;
use
yiiunit\data\ar\Profile
;
use
yiiunit\data\ar\Type
;
use
yiiunit\framework\ar\ActiveRecordTestTrait
;
...
...
@@ -46,6 +48,15 @@ class ActiveRecordTest extends DatabaseTestCase
return
OrderItem
::
className
();
}
public
function
getOrderWithNullFKClass
()
{
return
OrderWithNullFK
::
className
();
}
public
function
getOrderIteWithNullFKmClass
()
{
return
OrderItemWithNullFK
::
className
();
}
public
function
testCustomColumns
()
{
// find custom column
...
...
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