Skip to content

Commit c300915

Browse files
committed
Avoiding forced all fields in a contained belongsToMany, fixes #7913
1 parent b13d34a commit c300915

File tree

3 files changed

+36
-11
lines changed

3 files changed

+36
-11
lines changed

src/ORM/Association/BelongsToMany.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1095,11 +1095,23 @@ protected function _collectJointEntities($sourceEntity, $targetEntities)
10951095
protected function _buildQuery($options)
10961096
{
10971097
$name = $this->_junctionAssociationName();
1098+
$assoc = $this->target()->association($name);
1099+
$queryBuilder = false;
1100+
1101+
if (!empty($options['queryBuilder'])) {
1102+
$queryBuilder = $options['queryBuilder'];
1103+
unset($options['queryBuilder']);
1104+
}
1105+
10981106
$query = $this->_buildBaseQuery($options);
1107+
$query->addDefaultTypes($assoc->target());
1108+
1109+
if ($queryBuilder) {
1110+
$query = $queryBuilder($query);
1111+
}
10991112

11001113
$keys = $this->_linkField($options);
11011114
$query = $this->_appendJunctionJoin($query, $keys);
1102-
$assoc = $this->target()->association($name);
11031115

11041116
$query->autoFields($query->clause('select') === [])
11051117
->select($query->aliasFields((array)$assoc->foreignKey(), $name));

src/ORM/Association/SelectableAssociationTrait.php

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,7 @@ public function requiresKeys(array $options = [])
4343
public function eagerLoader(array $options)
4444
{
4545
$options += $this->_defaultOptions();
46-
$queryBuilder = false;
47-
if (!empty($options['queryBuilder'])) {
48-
$queryBuilder = $options['queryBuilder'];
49-
unset($options['queryBuilder']);
50-
}
51-
5246
$fetchQuery = $this->_buildQuery($options);
53-
if ($queryBuilder) {
54-
$fetchQuery = $queryBuilder($fetchQuery);
55-
}
5647
$resultMap = $this->_buildResultMap($fetchQuery, $options);
5748
return $this->_resultInjector($fetchQuery, $resultMap, $options);
5849
}
@@ -123,7 +114,7 @@ protected function _buildQuery($options)
123114
}
124115

125116
if (!empty($options['queryBuilder'])) {
126-
$options['queryBuilder']($fetchQuery);
117+
$fetchQuery = $options['queryBuilder']($fetchQuery);
127118
}
128119

129120
return $fetchQuery;

tests/TestCase/ORM/QueryRegressionTest.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,4 +1236,26 @@ public function testCountWithComplexOrderBy()
12361236
// Not executing the query first, just getting the count
12371237
$this->assertEquals(3, $query->count());
12381238
}
1239+
1240+
/**
1241+
* Tests that fetching belongsToMany association will not force
1242+
* all fields being returned, but intead will honor the select() clause
1243+
*
1244+
* @see https://github.com/cakephp/cakephp/issues/7913
1245+
* @return void
1246+
*/
1247+
public function testEagerLoadingBelongsToManyLimitedFields()
1248+
{
1249+
$table = TableRegistry::get('Articles');
1250+
$table->belongsToMany('Tags');
1251+
$result = $table
1252+
->find()
1253+
->contain(['Tags' => function ($q) {
1254+
return $q->select(['id']);
1255+
}])
1256+
->first();
1257+
1258+
$this->assertNotEmpty($result->tags[0]->id);
1259+
$this->assertEmpty($result->tags[0]->name);
1260+
}
12391261
}

0 commit comments

Comments
 (0)