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
d794a813
Commit
d794a813
authored
Mar 04, 2012
by
Qiang Xue
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...
parent
62336b43
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
68 additions
and
164 deletions
+68
-164
ActiveFinder.php
framework/db/ar/ActiveFinder.php
+0
-0
ActiveQuery.php
framework/db/ar/ActiveQuery.php
+0
-4
JoinElement.php
framework/db/ar/JoinElement.php
+12
-110
Command.php
framework/db/dao/Command.php
+1
-1
QueryBuilder.php
framework/db/dao/QueryBuilder.php
+52
-47
ActiveRecordTest.php
tests/unit/framework/db/ar/ActiveRecordTest.php
+3
-2
No files found.
framework/db/ar/ActiveFinder.php
View file @
d794a813
This diff is collapsed.
Click to expand it.
framework/db/ar/ActiveQuery.php
View file @
d794a813
...
...
@@ -243,10 +243,6 @@ class ActiveQuery extends BaseActiveQuery implements \IteratorAggregate, \ArrayA
protected
function
findRecords
()
{
$finder
=
new
ActiveFinder
(
$this
->
getDbConnection
());
if
(
!
empty
(
$this
->
with
))
{
return
$finder
->
findRecordsWithRelations
(
$this
);
}
else
{
return
$finder
->
findRecords
(
$this
);
}
}
}
framework/db/ar/JoinElement.php
View file @
d794a813
...
...
@@ -49,9 +49,10 @@ class JoinElement extends \yii\base\Object
public
$relatedRecords
;
/**
* @param integer $id
* @param ActiveRelation|ActiveQuery $query
* @param JoinElement $parent
* @param JoinElement $container
* @param
null|
JoinElement $parent
* @param
null|
JoinElement $container
*/
public
function
__construct
(
$id
,
$query
,
$parent
,
$container
)
{
...
...
@@ -70,6 +71,7 @@ class JoinElement extends \yii\base\Object
*/
public
function
createRecord
(
$row
)
{
if
(
$this
->
query
->
indexBy
===
null
)
{
$pk
=
array
();
foreach
(
$this
->
pkAlias
as
$alias
)
{
if
(
isset
(
$row
[
$alias
]))
{
...
...
@@ -79,6 +81,14 @@ class JoinElement extends \yii\base\Object
}
}
$pk
=
count
(
$pk
)
===
1
?
$pk
[
0
]
:
serialize
(
$pk
);
}
else
{
$pk
=
array_search
(
$this
->
query
->
indexBy
,
$this
->
columnAliases
);
if
(
$pk
!==
false
)
{
$pk
=
$row
[
$pk
];
}
else
{
throw
new
Exception
(
"Invalid indexBy:
{
$this
->
query
->
modelClass
}
has no attribute named '
{
$this
->
query
->
indexBy
}
'."
);
}
}
// create record
if
(
isset
(
$this
->
records
[
$pk
]))
{
...
...
@@ -125,111 +135,4 @@ class JoinElement extends \yii\base\Object
return
$record
;
}
public
function
buildQuery
(
$query
)
{
$prefixes
=
array
(
'@.'
=>
$this
->
query
->
tableAlias
.
'.'
,
'?.'
=>
$this
->
parent
->
query
->
tableAlias
.
'.'
,
);
$quotedPrefixes
=
''
;
foreach
(
$this
->
buildSelect
(
$this
->
query
->
select
)
as
$column
)
{
$query
->
select
[]
=
strtr
(
$column
,
$prefixes
);
}
if
(
$this
->
query
->
where
!==
null
)
{
$query
->
where
[]
=
strtr
(
$this
->
query
->
where
,
$prefixes
);
}
if
(
$this
->
query
->
having
!==
null
)
{
$query
->
having
[]
=
strtr
(
$this
->
query
->
having
,
$prefixes
);
}
if
(
$this
->
query
->
via
!==
null
)
{
$query
->
join
[]
=
$this
->
query
->
via
;
}
$modelClass
=
$this
->
query
->
modelClass
;
$tableName
=
$modelClass
::
tableName
();
$joinType
=
$this
->
query
->
joinType
===
null
?
'LEFT JOIN'
:
$this
->
query
->
joinType
;
$join
=
"
$joinType
$tableName
{
$this
->
query
->
tableAlias
}
"
;
if
(
$this
->
query
->
on
!==
null
)
{
$join
.=
' ON '
.
strtr
(
$this
->
query
->
on
,
$prefixes
);
}
$query
->
join
[]
=
$join
;
if
(
$this
->
query
->
join
!==
null
)
{
$query
->
join
[]
=
strtr
(
$this
->
query
->
join
,
$prefixes
);
}
// todo: convert orderBy to array first
if
(
$this
->
query
->
orderBy
!==
null
)
{
$query
->
orderBy
[]
=
strtr
(
$this
->
query
->
orderBy
,
$prefixes
);
}
// todo: convert groupBy to array first
if
(
$this
->
query
->
groupBy
!==
null
)
{
$query
->
groupBy
[]
=
strtr
(
$this
->
query
->
groupBy
,
$prefixes
);
}
if
(
$this
->
query
->
params
!==
null
)
{
foreach
(
$this
->
query
->
params
as
$name
=>
$value
)
{
if
(
is_integer
(
$name
))
{
$query
->
params
[]
=
$value
;
}
else
{
$query
->
params
[
$name
]
=
$value
;
}
}
}
foreach
(
$this
->
children
as
$child
)
{
$child
->
buildQuery
(
$query
);
}
}
public
function
buildSelect
(
$select
)
{
if
(
$select
===
false
)
{
return
array
();
}
$modelClass
=
$this
->
query
->
modelClass
;
$table
=
$modelClass
::
getMetaData
()
->
table
;
$columns
=
array
();
$columnCount
=
0
;
$prefix
=
$this
->
query
->
tableAlias
;
if
(
empty
(
$select
)
||
$select
===
'*'
)
{
foreach
(
$table
->
columns
as
$column
)
{
$alias
=
"t
{
$this
->
id
}
c"
.
(
$columnCount
++
);
$columns
[]
=
"
$prefix
.
{
$column
->
name
}
AS
$alias
"
;
$this
->
columnAliases
[
$alias
]
=
$column
->
name
;
if
(
$column
->
isPrimaryKey
)
{
$this
->
pkAlias
[
$column
->
name
]
=
$alias
;
}
}
}
else
{
if
(
is_string
(
$select
))
{
$select
=
explode
(
','
,
$select
);
}
foreach
(
$table
->
primaryKey
as
$column
)
{
$alias
=
"t
{
$this
->
id
}
c"
.
(
$columnCount
++
);
$columns
[]
=
"
$prefix
.
$column
AS
$alias
"
;
$this
->
pkAlias
[
$column
]
=
$alias
;
}
foreach
(
$select
as
$column
)
{
$column
=
trim
(
$column
);
if
(
preg_match
(
'/^(.*?)\s+AS\s+(\w+)$/im'
,
$column
,
$matches
))
{
// if the column is already aliased
$this
->
columnAliases
[
$matches
[
2
]]
=
$matches
[
2
];
$columns
[]
=
$column
;
}
elseif
(
!
isset
(
$this
->
pkAlias
[
$column
]))
{
$alias
=
"t
{
$this
->
id
}
c"
.
(
$columnCount
++
);
$columns
[]
=
"
$prefix
.
$column
AS
$alias
"
;
$this
->
columnAliases
[
$alias
]
=
$column
;
}
}
}
return
$columns
;
}
}
\ No newline at end of file
framework/db/dao/Command.php
View file @
d794a813
...
...
@@ -355,7 +355,7 @@ class Command extends \yii\base\Component
}
\Yii
::
trace
(
"Querying SQL:
{
$sql
}{
$paramLog
}
"
,
__CLASS__
);
echo
$sql
.
"
\n\n
"
;
if
(
$db
->
queryCachingCount
>
0
&&
$db
->
queryCachingDuration
>=
0
&&
$method
!==
''
)
{
$cache
=
\Yii
::
$application
->
getComponent
(
$db
->
queryCacheID
);
}
...
...
framework/db/dao/QueryBuilder.php
View file @
d794a813
...
...
@@ -43,7 +43,7 @@ class QueryBuilder extends \yii\base\Object
*/
public
$typeMap
=
array
();
/**
* @var Query the Query object that is currently processed by the query builder to generate a SQL statement.
* @var Query the Query object that is currently
being
processed by the query builder to generate a SQL statement.
*/
public
$query
;
...
...
@@ -63,17 +63,16 @@ class QueryBuilder extends \yii\base\Object
*/
public
function
build
(
$query
)
{
$this
->
query
=
$query
;
$clauses
=
array
(
$this
->
buildSelect
(),
$this
->
buildFrom
(),
$this
->
buildJoin
(),
$this
->
buildWhere
(),
$this
->
buildGroupBy
(),
$this
->
buildHaving
(),
$this
->
buildUnion
(),
$this
->
buildOrderBy
(),
$this
->
buildLimit
(),
$this
->
buildSelect
(
$query
->
select
,
$query
->
distinct
,
$query
->
selectOption
),
$this
->
buildFrom
(
$query
->
from
),
$this
->
buildJoin
(
$query
->
join
),
$this
->
buildWhere
(
$query
->
where
),
$this
->
buildGroupBy
(
$query
->
groupBy
),
$this
->
buildHaving
(
$query
->
having
),
$this
->
buildUnion
(
$query
->
union
),
$this
->
buildOrderBy
(
$query
->
orderBy
),
$this
->
buildLimit
(
$query
->
limit
,
$query
->
offset
),
);
return
implode
(
$this
->
separator
,
array_filter
(
$clauses
));
}
...
...
@@ -161,7 +160,7 @@ class QueryBuilder extends \yii\base\Object
$this
->
query
->
addParams
(
$params
);
}
$sql
=
'UPDATE '
.
$this
->
quoteTableName
(
$table
)
.
' SET '
.
implode
(
', '
,
$lines
);
if
((
$where
=
$this
->
buildCondition
(
$condition
))
!=
''
)
{
if
((
$where
=
$this
->
buildCondition
(
$condition
))
!=
=
''
)
{
$sql
.=
' WHERE '
.
$where
;
}
...
...
@@ -185,7 +184,7 @@ class QueryBuilder extends \yii\base\Object
public
function
delete
(
$table
,
$condition
=
''
,
$params
=
array
())
{
$sql
=
'DELETE FROM '
.
$this
->
quoteTableName
(
$table
);
if
((
$where
=
$this
->
buildCondition
(
$condition
))
!=
''
)
{
if
((
$where
=
$this
->
buildCondition
(
$condition
))
!=
=
''
)
{
$sql
.=
' WHERE '
.
$where
;
}
if
(
$params
!==
array
()
&&
$this
->
query
instanceof
BaseQuery
)
{
...
...
@@ -620,16 +619,18 @@ class QueryBuilder extends \yii\base\Object
}
/**
* @param string|array $columns
* @param boolean $distinct
* @param string $selectOption
* @return string the SELECT clause built from [[query]].
*/
p
rotected
function
buildSelect
(
)
p
ublic
function
buildSelect
(
$columns
,
$distinct
=
false
,
$selectOption
=
null
)
{
$select
=
$
this
->
query
->
distinct
?
'SELECT DISTINCT'
:
'SELECT'
;
if
(
$
this
->
query
->
selectOption
!==
null
)
{
$select
.=
' '
.
$
this
->
query
->
selectOption
;
$select
=
$distinct
?
'SELECT DISTINCT'
:
'SELECT'
;
if
(
$selectOption
!==
null
)
{
$select
.=
' '
.
$selectOption
;
}
$columns
=
$this
->
query
->
select
;
if
(
empty
(
$columns
))
{
return
$select
.
' *'
;
}
...
...
@@ -664,16 +665,15 @@ class QueryBuilder extends \yii\base\Object
}
/**
* @param string|array $tables
* @return string the FROM clause built from [[query]].
*/
p
rotected
function
buildFrom
(
)
p
ublic
function
buildFrom
(
$tables
)
{
if
(
empty
(
$t
his
->
query
->
from
))
{
if
(
empty
(
$t
ables
))
{
return
''
;
}
$tables
=
$this
->
query
->
from
;
if
(
$this
->
autoQuote
)
{
$driver
=
$this
->
connection
->
driver
;
if
(
!
is_array
(
$tables
))
{
...
...
@@ -702,11 +702,11 @@ class QueryBuilder extends \yii\base\Object
}
/**
* @param string|array $joins
* @return string the JOIN clause built from [[query]].
*/
p
rotected
function
buildJoin
(
)
p
ublic
function
buildJoin
(
$joins
)
{
$joins
=
$this
->
query
->
join
;
if
(
empty
(
$joins
))
{
return
''
;
}
...
...
@@ -715,7 +715,7 @@ class QueryBuilder extends \yii\base\Object
}
foreach
(
$joins
as
$i
=>
$join
)
{
if
(
is_array
(
$join
))
{
//
join type, table name,
on-condition
if
(
is_array
(
$join
))
{
//
0:join type, 1:table name, 2:
on-condition
if
(
isset
(
$join
[
0
],
$join
[
1
]))
{
$table
=
$join
[
1
];
if
(
$this
->
autoQuote
&&
strpos
(
$table
,
'('
)
===
false
)
{
...
...
@@ -743,44 +743,47 @@ class QueryBuilder extends \yii\base\Object
}
/**
* @param string|array $condition
* @return string the WHERE clause built from [[query]].
*/
p
rotected
function
buildWhere
(
)
p
ublic
function
buildWhere
(
$condition
)
{
$where
=
$this
->
buildCondition
(
$
this
->
query
->
where
);
return
empty
(
$where
)
?
''
:
'WHERE '
.
$where
;
$where
=
$this
->
buildCondition
(
$
condition
);
return
$where
===
''
?
''
:
'WHERE '
.
$where
;
}
/**
* @return string the GROUP BY clause built from [[query]].
* @param string|array $columns
* @return string the GROUP BY clause
*/
p
rotected
function
buildGroupBy
(
)
p
ublic
function
buildGroupBy
(
$columns
)
{
if
(
empty
(
$
this
->
query
->
groupBy
))
{
if
(
empty
(
$
columns
))
{
return
''
;
}
else
{
return
'GROUP BY '
.
$this
->
buildColumns
(
$
this
->
query
->
groupBy
);
return
'GROUP BY '
.
$this
->
buildColumns
(
$
columns
);
}
}
/**
* @param string|array $condition
* @return string the HAVING clause built from [[query]].
*/
p
rotected
function
buildHaving
(
)
p
ublic
function
buildHaving
(
$condition
)
{
$having
=
$this
->
buildCondition
(
$
this
->
query
->
having
);
return
empty
(
$having
)
?
''
:
'HAVING '
.
$having
;
$having
=
$this
->
buildCondition
(
$
condition
);
return
$having
===
''
?
''
:
'HAVING '
.
$having
;
}
/**
* @param string|array $columns
* @return string the ORDER BY clause built from [[query]].
*/
p
rotected
function
buildOrderBy
(
)
p
ublic
function
buildOrderBy
(
$columns
)
{
if
(
empty
(
$
this
->
query
->
orderBy
))
{
if
(
empty
(
$
columns
))
{
return
''
;
}
$columns
=
$this
->
query
->
orderBy
;
if
(
$this
->
autoQuote
)
{
$driver
=
$this
->
connection
->
driver
;
if
(
!
is_array
(
$columns
))
{
...
...
@@ -809,26 +812,28 @@ class QueryBuilder extends \yii\base\Object
}
/**
* @param integer $limit
* @param integer $offset
* @return string the LIMIT and OFFSET clauses built from [[query]].
*/
p
rotected
function
buildLimit
(
)
p
ublic
function
buildLimit
(
$limit
,
$offset
)
{
$sql
=
''
;
if
(
$
this
->
query
->
limit
!==
null
&&
$this
->
query
->
limit
>=
0
)
{
$sql
=
'LIMIT '
.
(
int
)
$
this
->
query
->
limit
;
if
(
$
limit
!==
null
&&
$
limit
>=
0
)
{
$sql
=
'LIMIT '
.
(
int
)
$limit
;
}
if
(
$
this
->
query
->
offset
>
0
)
{
$sql
.=
' OFFSET '
.
(
int
)
$
this
->
query
->
offset
;
if
(
$offset
>
0
)
{
$sql
.=
' OFFSET '
.
(
int
)
$offset
;
}
return
ltrim
(
$sql
);
}
/**
* @param string|array $unions
* @return string the UNION clause built from [[query]].
*/
p
rotected
function
buildUnion
(
)
p
ublic
function
buildUnion
(
$unions
)
{
$unions
=
$this
->
query
->
union
;
if
(
empty
(
$unions
))
{
return
''
;
}
...
...
@@ -836,8 +841,8 @@ class QueryBuilder extends \yii\base\Object
$unions
=
array
(
$unions
);
}
foreach
(
$unions
as
$i
=>
$union
)
{
if
(
$union
instanceof
Query
)
{
$unions
[
$i
]
=
$
union
->
getSql
(
$this
->
connect
ion
);
if
(
$union
instanceof
Base
Query
)
{
$unions
[
$i
]
=
$
this
->
build
(
$un
ion
);
}
}
return
"UNION (
\n
"
.
implode
(
"
\n
) UNION (
\n
"
,
$unions
)
.
"
\n
)"
;
...
...
tests/unit/framework/db/ar/ActiveRecordTest.php
View file @
d794a813
...
...
@@ -219,17 +219,18 @@ class ActiveRecordTest extends \yiiunit\MysqlTestCase
// indexBy
$customers
=
Customer
::
find
()
->
orderBy
(
'id'
)
->
indexBy
(
'name'
)
->
all
();
$this
->
assertEquals
(
2
,
$customers
[
'user2'
][
'id'
]);
}
public
function
testEagerLoading
()
{
$customers
=
Customer
::
find
()
->
with
(
'orders'
)
->
orderBy
(
'
t0
.id'
)
->
all
();
$customers
=
Customer
::
find
()
->
with
(
'orders'
)
->
orderBy
(
'
@
.id'
)
->
all
();
$this
->
assertEquals
(
3
,
count
(
$customers
));
$this
->
assertEquals
(
1
,
count
(
$customers
[
0
]
->
orders
));
$this
->
assertEquals
(
2
,
count
(
$customers
[
1
]
->
orders
));
$this
->
assertEquals
(
0
,
count
(
$customers
[
2
]
->
orders
));
$customers
=
Customer
::
find
()
->
with
(
'orders.customer'
)
->
orderBy
(
'
t0
.id'
)
->
all
();
$customers
=
Customer
::
find
()
->
with
(
'orders.customer'
)
->
orderBy
(
'
@
.id'
)
->
all
();
}
/*
...
...
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