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
dc720d9b
Commit
dc720d9b
authored
Dec 24, 2013
by
Qiang Xue
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
more docs about joinwith()
parent
08ef80a2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
49 additions
and
6 deletions
+49
-6
active-record.md
docs/guide/active-record.md
+42
-3
ActiveQuery.php
framework/yii/db/ActiveQuery.php
+7
-3
No files found.
docs/guide/active-record.md
View file @
dc720d9b
...
...
@@ -400,14 +400,53 @@ $orders = Order::find()->joinWith('books')->all();
// find all orders that contain books, and sort the orders by the book names.
$orders
=
Order
::
find
()
->
joinWith
([
'books'
=>
function
(
$query
)
{
$query
->
orderBy
(
'tbl_item.
name
'
);
$query
->
orderBy
(
'tbl_item.
id
'
);
}
])
->
all
();
```
Note that
[
[ActiveQuery::joinWith()
]
] differs from
[
[ActiveQuery::with()
]
] in that the former will build up
and execute a JOIN SQL statement. For example,
`Order::find()->joinWith('books')->all()`
returns all orders that
contain books, while
`Order::find()->with('books')->all()`
returns all orders regardless they contain books or not.
and execute a JOIN SQL statement for the primary model class. For example,
`Order::find()->joinWith('books')->all()`
returns all orders that contain books, while
`Order::find()->with('books')->all()`
returns all orders
regardless they contain books or not.
Because
`joinWith()`
will cause generating a JOIN SQL statement, you are responsible to disambiguate column
names. For example, we use
`tbl_item.id`
to disambiguate the
`id`
column reference because both of the order table
and the item table contain a column named
`id`
.
You may join with one or multiple relations. You may also join with sub-relations. For example,
```
php
// join with multiple relations
// find out the orders that contain books and are placed by customers who registered within the past 24 hours
$orders
=
Order
::
find
()
->
joinWith
([
'books'
,
'customer'
=>
function
(
$query
)
{
$query
->
where
(
'tbl_customer.create_time > '
.
(
time
()
-
24
*
3600
));
}
])
->
all
();
// join with sub-relations: join with books and books' authors
$orders
=
Order
::
find
()
->
joinWith
(
'books.author'
)
->
all
();
```
By default, when you join with a relation, the relation will also be eagerly loaded. You may change this behavior
by passing the
`$eagerLoading`
parameter which specifies whether to eager load the specified relations.
Also, when the relations are joined with the primary table, the default join type is
`INNER JOIN`
. You may change
to use other type of joins, such as
`LEFT JOIN`
.
Below are some more examples,
```
php
// find all orders that contain books, but do not eager loading "books".
$orders
=
Order
::
find
()
->
joinWith
(
'books'
,
false
)
->
all
();
// find all orders and sort them by the customer IDs. Do not eager loading "customer".
$orders
=
Order
::
find
()
->
joinWith
([
'customer'
=>
function
(
$query
)
{
$query
->
orderBy
(
'tbl_customer.id'
);
},
],
false
,
'LEFT JOIN'
)
->
all
();
```
Working with Relationships
...
...
framework/yii/db/ActiveQuery.php
View file @
dc720d9b
...
...
@@ -220,9 +220,13 @@ class ActiveQuery extends Query implements ActiveQueryInterface
* ])->all();
* ```
*
* @param bool $eagerLoading
* @param string $joinType
* @return $this
* @param boolean|array $eagerLoading whether to eager load the relations specified in `$with`.
* When this is a boolean, it applies to all relations specified in `$with`. Use an array
* to explicitly list which relations in `$with` need to be eagerly loaded.
* @param string|array $joinType the join type of the relations specified in `$with`.
* When this is a string, it applies to all relations specified in `$with`. Use an array
* in the format of `relationName => joinType` to specify different join types for different relations.
* @return static the query object itself
*/
public
function
joinWith
(
$with
,
$eagerLoading
=
true
,
$joinType
=
'INNER JOIN'
)
{
...
...
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