Skip to content

Commit

Permalink
Avoiding forced all fields in a contained belongsToMany, fixes #7913
Browse files Browse the repository at this point in the history
  • Loading branch information
lorenzo committed Dec 30, 2015
1 parent b13d34a commit c300915
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 11 deletions.
14 changes: 13 additions & 1 deletion src/ORM/Association/BelongsToMany.php
Expand Up @@ -1095,11 +1095,23 @@ protected function _collectJointEntities($sourceEntity, $targetEntities)
protected function _buildQuery($options)
{
$name = $this->_junctionAssociationName();
$assoc = $this->target()->association($name);
$queryBuilder = false;

if (!empty($options['queryBuilder'])) {
$queryBuilder = $options['queryBuilder'];
unset($options['queryBuilder']);
}

$query = $this->_buildBaseQuery($options);
$query->addDefaultTypes($assoc->target());

if ($queryBuilder) {
$query = $queryBuilder($query);
}

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

$query->autoFields($query->clause('select') === [])
->select($query->aliasFields((array)$assoc->foreignKey(), $name));
Expand Down
11 changes: 1 addition & 10 deletions src/ORM/Association/SelectableAssociationTrait.php
Expand Up @@ -43,16 +43,7 @@ public function requiresKeys(array $options = [])
public function eagerLoader(array $options)
{
$options += $this->_defaultOptions();
$queryBuilder = false;
if (!empty($options['queryBuilder'])) {
$queryBuilder = $options['queryBuilder'];
unset($options['queryBuilder']);
}

$fetchQuery = $this->_buildQuery($options);
if ($queryBuilder) {
$fetchQuery = $queryBuilder($fetchQuery);
}
$resultMap = $this->_buildResultMap($fetchQuery, $options);
return $this->_resultInjector($fetchQuery, $resultMap, $options);
}
Expand Down Expand Up @@ -123,7 +114,7 @@ protected function _buildQuery($options)
}

if (!empty($options['queryBuilder'])) {
$options['queryBuilder']($fetchQuery);
$fetchQuery = $options['queryBuilder']($fetchQuery);
}

return $fetchQuery;
Expand Down
22 changes: 22 additions & 0 deletions tests/TestCase/ORM/QueryRegressionTest.php
Expand Up @@ -1236,4 +1236,26 @@ public function testCountWithComplexOrderBy()
// Not executing the query first, just getting the count
$this->assertEquals(3, $query->count());
}

/**
* Tests that fetching belongsToMany association will not force
* all fields being returned, but intead will honor the select() clause
*
* @see https://github.com/cakephp/cakephp/issues/7913
* @return void
*/
public function testEagerLoadingBelongsToManyLimitedFields()
{
$table = TableRegistry::get('Articles');
$table->belongsToMany('Tags');
$result = $table
->find()
->contain(['Tags' => function ($q) {
return $q->select(['id']);
}])
->first();

$this->assertNotEmpty($result->tags[0]->id);
$this->assertEmpty($result->tags[0]->name);
}
}

0 comments on commit c300915

Please sign in to comment.