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
62336b43
Commit
62336b43
authored
Mar 02, 2012
by
Qiang Xue
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...
parent
50743935
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
270 additions
and
113 deletions
+270
-113
ActiveFinder.php
framework/db/ar/ActiveFinder.php
+174
-45
ActiveQuery.php
framework/db/ar/ActiveQuery.php
+5
-5
ActiveRecord.php
framework/db/ar/ActiveRecord.php
+12
-6
JoinElement.php
framework/db/ar/JoinElement.php
+79
-57
No files found.
framework/db/ar/ActiveFinder.php
View file @
62336b43
This diff is collapsed.
Click to expand it.
framework/db/ar/ActiveQuery.php
View file @
62336b43
...
...
@@ -91,8 +91,8 @@ class ActiveQuery extends BaseActiveQuery implements \IteratorAggregate, \ArrayA
public
function
one
()
{
if
(
$this
->
records
===
null
)
{
// todo: load only one record
$this
->
records
=
$this
->
findRecords
(
false
);
$this
->
limit
=
1
;
$this
->
records
=
$this
->
findRecords
();
}
return
isset
(
$this
->
records
[
0
])
?
$this
->
records
[
0
]
:
null
;
}
...
...
@@ -240,13 +240,13 @@ class ActiveQuery extends BaseActiveQuery implements \IteratorAggregate, \ArrayA
unset
(
$this
->
records
[
$offset
]);
}
protected
function
findRecords
(
$all
=
true
)
protected
function
findRecords
()
{
$finder
=
new
ActiveFinder
(
$this
->
getDbConnection
());
if
(
!
empty
(
$this
->
with
))
{
return
$finder
->
findRecordsWithRelations
();
return
$finder
->
findRecordsWithRelations
(
$this
);
}
else
{
return
$finder
->
findRecords
(
$this
,
$all
);
return
$finder
->
findRecords
(
$this
);
}
}
}
framework/db/ar/ActiveRecord.php
View file @
62336b43
...
...
@@ -517,10 +517,18 @@ abstract class ActiveRecord extends Model
$this
->
_related
[
$relation
->
name
]
=
$relation
->
hasMany
?
array
()
:
null
;
}
/**
* @param ActiveRelation $relation
* @param ActiveRecord $record
*/
public
function
addRelatedRecord
(
$relation
,
$record
)
{
if
(
$relation
->
hasMany
)
{
$this
->
_related
[
$relation
->
name
][]
=
$record
;
if
(
$relation
->
indexBy
!==
null
)
{
$this
->
_related
[
$relation
->
name
][
$record
->
{
$relation
->
indexBy
}]
=
$record
;
}
else
{
$this
->
_related
[
$relation
->
name
][]
=
$record
;
}
}
else
{
$this
->
_related
[
$relation
->
name
]
=
$record
;
}
...
...
@@ -1027,12 +1035,10 @@ abstract class ActiveRecord extends Model
/**
* Creates an active record with the given attributes.
* This method is internally used by the find methods.
* @param array $row attribute values (column name=>column value)
* @return ActiveRecord the newly created active record. The class of the object is the same as the model class.
* Null is returned if the input data is false.
* @param array $row attribute values (name => value)
* @return ActiveRecord the newly created active record.
*/
public
static
function
create
Record
(
$row
)
public
static
function
create
(
$row
)
{
$record
=
static
::
instantiate
(
$row
);
$columns
=
static
::
getMetaData
()
->
table
->
columns
;
...
...
framework/db/ar/JoinElement.php
View file @
62336b43
...
...
@@ -18,9 +18,13 @@ use yii\db\Exception;
class
JoinElement
extends
\yii\base\Object
{
/**
* @var
ActiveRelation
* @var
integer ID of this join element
*/
public
$relation
;
public
$id
;
/**
* @var BaseActiveQuery
*/
public
$query
;
/**
* @var JoinElement the parent element that this element needs to join with
*/
...
...
@@ -32,9 +36,9 @@ class JoinElement extends \yii\base\Object
/**
* @var JoinElement[] the child elements that have relations declared in the AR class of this element
*/
public
$relat
edChildren
=
array
();
public
$relat
ions
=
array
();
/**
* @var boolean whether this element is only for join purpose. If
tru
e, data will also be populated into the AR of this element.
* @var boolean whether this element is only for join purpose. If
fals
e, data will also be populated into the AR of this element.
*/
public
$joinOnly
;
...
...
@@ -44,17 +48,27 @@ class JoinElement extends \yii\base\Object
public
$records
;
public
$relatedRecords
;
public
function
__construct
(
$relation
,
$parent
,
$relatedParent
)
/**
* @param ActiveRelation|ActiveQuery $query
* @param JoinElement $parent
* @param JoinElement $container
*/
public
function
__construct
(
$id
,
$query
,
$parent
,
$container
)
{
$this
->
relation
=
$relation
;
$this
->
id
=
$id
;
$this
->
query
=
$query
;
if
(
$parent
!==
null
)
{
$this
->
parent
=
$parent
;
$parent
->
children
[
$
relation
->
name
]
=
$this
;
$
relatedParent
->
relatedChildren
[
$relation
->
name
]
=
$this
;
$parent
->
children
[
$
query
->
name
]
=
$this
;
$
container
->
relations
[
$query
->
name
]
=
$this
;
}
}
public
function
populateData
(
$row
)
/**
* @param array $row
* @return null|ActiveRecord
*/
public
function
createRecord
(
$row
)
{
$pk
=
array
();
foreach
(
$this
->
pkAlias
as
$alias
)
{
...
...
@@ -66,7 +80,7 @@ class JoinElement extends \yii\base\Object
}
$pk
=
count
(
$pk
)
===
1
?
$pk
[
0
]
:
serialize
(
$pk
);
// create
active
record
// create record
if
(
isset
(
$this
->
records
[
$pk
]))
{
$record
=
$this
->
records
[
$pk
];
}
else
{
...
...
@@ -76,33 +90,37 @@ class JoinElement extends \yii\base\Object
$attributes
[
$this
->
columnAliases
[
$alias
]]
=
$value
;
}
}
$modelClass
=
$this
->
relation
->
modelClass
;
$
record
=
$modelClass
::
populateData
(
$attributes
);
$modelClass
=
$this
->
query
->
modelClass
;
$
this
->
records
[
$pk
]
=
$record
=
$modelClass
::
create
(
$attributes
);
foreach
(
$this
->
children
as
$child
)
{
if
(
$child
->
relation
->
select
!==
false
)
{
$record
->
initRelation
(
$child
->
relation
);
if
(
$child
->
query
->
select
!==
false
||
$child
->
joinOnly
)
{
$record
->
initRelation
(
$child
->
query
);
}
}
$this
->
records
[
$pk
]
=
$record
;
}
//
populate chil
d records
foreach
(
$this
->
relat
edChildren
as
$child
)
{
if
(
$child
->
relation
->
select
===
false
||
$child
->
joinOnly
)
{
//
add relate
d records
foreach
(
$this
->
relat
ions
as
$child
)
{
if
(
$child
->
query
->
select
===
false
||
$child
->
joinOnly
)
{
continue
;
}
$childRecord
=
$child
->
populateData
(
$row
);
$childRecord
=
$child
->
createRecord
(
$row
);
if
(
$childRecord
===
null
)
{
continue
;
}
if
(
$child
->
relation
->
hasMany
)
{
$fpk
=
serialize
(
$childRecord
->
getPrimaryKey
());
if
(
isset
(
$this
->
relatedRecords
[
$pk
][
$child
->
relation
->
name
][
$fpk
]))
{
continue
;
if
(
$child
->
query
->
hasMany
)
{
if
(
$child
->
query
->
indexBy
!==
null
)
{
$hash
=
$childRecord
->
{
$child
->
query
->
indexBy
};
}
else
{
$hash
=
serialize
(
$childRecord
->
getPrimaryKey
());
}
if
(
!
isset
(
$this
->
relatedRecords
[
$pk
][
$child
->
query
->
name
][
$hash
]))
{
$this
->
relatedRecords
[
$pk
][
$child
->
query
->
name
][
$hash
]
=
true
;
$record
->
addRelatedRecord
(
$child
->
query
,
$childRecord
);
}
$this
->
relatedRecords
[
$pk
][
$child
->
relation
->
name
][
$fpk
]
=
true
;
}
else
{
$record
->
addRelatedRecord
(
$child
->
query
,
$childRecord
);
}
$record
->
addRelatedRecord
(
$child
->
relation
,
$childRecord
);
}
return
$record
;
...
...
@@ -110,52 +128,53 @@ class JoinElement extends \yii\base\Object
public
function
buildQuery
(
$query
)
{
$
token
s
=
array
(
'@.'
=>
$this
->
relation
->
tableAlias
.
'.'
,
'?.'
=>
$this
->
parent
->
relation
->
tableAlias
.
'.'
,
$
prefixe
s
=
array
(
'@.'
=>
$this
->
query
->
tableAlias
.
'.'
,
'?.'
=>
$this
->
parent
->
query
->
tableAlias
.
'.'
,
);
foreach
(
$this
->
buildSelect
(
$this
->
relation
->
select
)
as
$column
)
{
$query
->
select
[]
=
strtr
(
$column
,
$tokens
);
$quotedPrefixes
=
''
;
foreach
(
$this
->
buildSelect
(
$this
->
query
->
select
)
as
$column
)
{
$query
->
select
[]
=
strtr
(
$column
,
$prefixes
);
}
if
(
$this
->
relation
->
where
!==
null
)
{
$query
->
where
[]
=
strtr
(
$this
->
relation
->
where
,
$token
s
);
if
(
$this
->
query
->
where
!==
null
)
{
$query
->
where
[]
=
strtr
(
$this
->
query
->
where
,
$prefixe
s
);
}
if
(
$this
->
relation
->
having
!==
null
)
{
$query
->
having
[]
=
strtr
(
$this
->
relation
->
having
,
$token
s
);
if
(
$this
->
query
->
having
!==
null
)
{
$query
->
having
[]
=
strtr
(
$this
->
query
->
having
,
$prefixe
s
);
}
if
(
$this
->
relation
->
via
!==
null
)
{
$query
->
join
[]
=
$this
->
relation
->
via
;
if
(
$this
->
query
->
via
!==
null
)
{
$query
->
join
[]
=
$this
->
query
->
via
;
}
$modelClass
=
$this
->
relation
->
modelClass
;
$modelClass
=
$this
->
query
->
modelClass
;
$tableName
=
$modelClass
::
tableName
();
$joinType
=
$this
->
relation
->
joinType
===
null
?
'LEFT JOIN'
:
$this
->
relation
->
joinType
;
$join
=
"
$joinType
$tableName
{
$this
->
relation
->
tableAlias
}
"
;
if
(
$this
->
relation
->
on
!==
null
)
{
$join
.=
' ON '
.
strtr
(
$this
->
relation
->
on
,
$token
s
);
$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
,
$prefixe
s
);
}
$query
->
join
[]
=
$join
;
if
(
$this
->
relation
->
join
!==
null
)
{
$query
->
join
[]
=
strtr
(
$this
->
relation
->
join
,
$token
s
);
if
(
$this
->
query
->
join
!==
null
)
{
$query
->
join
[]
=
strtr
(
$this
->
query
->
join
,
$prefixe
s
);
}
// todo: convert orderBy to array first
if
(
$this
->
relation
->
orderBy
!==
null
)
{
$query
->
orderBy
[]
=
strtr
(
$this
->
relation
->
orderBy
,
$token
s
);
if
(
$this
->
query
->
orderBy
!==
null
)
{
$query
->
orderBy
[]
=
strtr
(
$this
->
query
->
orderBy
,
$prefixe
s
);
}
// todo: convert groupBy to array first
if
(
$this
->
relation
->
groupBy
!==
null
)
{
$query
->
groupBy
[]
=
strtr
(
$this
->
relation
->
groupBy
,
$token
s
);
if
(
$this
->
query
->
groupBy
!==
null
)
{
$query
->
groupBy
[]
=
strtr
(
$this
->
query
->
groupBy
,
$prefixe
s
);
}
if
(
$this
->
relation
->
params
!==
null
)
{
foreach
(
$this
->
relation
->
params
as
$name
=>
$value
)
{
if
(
$this
->
query
->
params
!==
null
)
{
foreach
(
$this
->
query
->
params
as
$name
=>
$value
)
{
if
(
is_integer
(
$name
))
{
$query
->
params
[]
=
$value
;
}
else
{
...
...
@@ -171,14 +190,17 @@ class JoinElement extends \yii\base\Object
public
function
buildSelect
(
$select
)
{
$modelClass
=
$this
->
relation
->
modelClass
;
$tableSchema
=
$modelClass
::
getMetaData
()
->
table
;
if
(
$select
===
false
)
{
return
array
();
}
$modelClass
=
$this
->
query
->
modelClass
;
$table
=
$modelClass
::
getMetaData
()
->
table
;
$columns
=
array
();
$columnCount
=
0
;
$prefix
=
$this
->
relation
->
tableAlias
;
$prefix
=
$this
->
query
->
tableAlias
;
if
(
empty
(
$select
)
||
$select
===
'*'
)
{
foreach
(
$table
Schema
->
columns
as
$column
)
{
$alias
=
$this
->
relation
->
tableAlias
.
'_'
.
(
$columnCount
++
);
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
)
{
...
...
@@ -189,8 +211,8 @@ class JoinElement extends \yii\base\Object
if
(
is_string
(
$select
))
{
$select
=
explode
(
','
,
$select
);
}
foreach
(
$table
Schema
->
primaryKey
as
$column
)
{
$alias
=
$this
->
relation
->
tableAlias
.
'_'
.
(
$columnCount
++
);
foreach
(
$table
->
primaryKey
as
$column
)
{
$alias
=
"t
{
$this
->
id
}
c"
.
(
$columnCount
++
);
$columns
[]
=
"
$prefix
.
$column
AS
$alias
"
;
$this
->
pkAlias
[
$column
]
=
$alias
;
}
...
...
@@ -201,7 +223,7 @@ class JoinElement extends \yii\base\Object
$this
->
columnAliases
[
$matches
[
2
]]
=
$matches
[
2
];
$columns
[]
=
$column
;
}
elseif
(
!
isset
(
$this
->
pkAlias
[
$column
]))
{
$alias
=
$this
->
relation
->
tableAlias
.
'_'
.
(
$columnCount
++
);
$alias
=
"t
{
$this
->
id
}
c"
.
(
$columnCount
++
);
$columns
[]
=
"
$prefix
.
$column
AS
$alias
"
;
$this
->
columnAliases
[
$alias
]
=
$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