Skip to content

Commit 7e593ac

Browse files
committed
Avoid exclusion of relationship columns, see #185
1 parent e2f9d8a commit 7e593ac

File tree

1 file changed

+31
-20
lines changed

1 file changed

+31
-20
lines changed

api.php

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1516,28 +1516,36 @@ protected function retrieveInputs($data) {
15161516
return is_array($input)?$input:array($input);
15171517
}
15181518

1519-
protected function addRelationColumns($columns,$select) {
1520-
if ($columns) {
1521-
foreach ($select as $table=>$keys) {
1522-
foreach ($keys as $key=>$other) {
1523-
$columns.=",$table.$key,".implode('.',$other);
1524-
}
1519+
protected function getRelationColumns($select) {
1520+
$keep = array();
1521+
foreach ($select as $table=>$keys) {
1522+
foreach ($keys as $key=>$other) {
1523+
if (!isset($keep[$table])) $keep[$table] = array();
1524+
$keep[$table][$key]=true;
1525+
list($table2,$key2) = $other;
1526+
if (!isset($keep[$table2])) $keep[$table2] = array();
1527+
$keep[$table2][$key2]=true;
15251528
}
15261529
}
1527-
return $columns;
1530+
return $keep;
15281531
}
15291532

1530-
protected function findFields($tables,$columns,$exclude,$database) {
1533+
protected function findFields($tables,$columns,$exclude,$select,$database) {
15311534
$fields = array();
1535+
if ($select && ($columns || $exclude)) {
1536+
$keep = $this->getRelationColumns($select);
1537+
} else {
1538+
$keep = false;
1539+
}
15321540
foreach ($tables as $i=>$table) {
15331541
$fields[$table] = $this->findTableFields($table,$database);
1534-
$fields[$table] = $this->filterFieldsByColumns($fields[$table],$columns,$i==0,$table);
1535-
$fields[$table] = $this->filterFieldsByExclude($fields[$table],$exclude,$i==0,$table);
1542+
$fields[$table] = $this->filterFieldsByColumns($fields[$table],$columns,$keep,$i==0,$table);
1543+
$fields[$table] = $this->filterFieldsByExclude($fields[$table],$exclude,$keep,$i==0,$table);
15361544
}
15371545
return $fields;
15381546
}
15391547

1540-
protected function filterFieldsByColumns($fields,$columns,$first,$table) {
1548+
protected function filterFieldsByColumns($fields,$columns,$keep,$first,$table) {
15411549
if ($columns) {
15421550
$columns = explode(',',$columns);
15431551
foreach (array_keys($fields) as $key) {
@@ -1553,29 +1561,33 @@ protected function filterFieldsByColumns($fields,$columns,$first,$table) {
15531561
}
15541562
}
15551563
}
1556-
if ($delete) unset($fields[$key]);
1564+
if ($delete && !isset($keep[$table][$key])) {
1565+
unset($fields[$key]);
1566+
}
15571567
}
15581568
}
15591569
return $fields;
15601570
}
15611571

1562-
protected function filterFieldsByExclude($fields,$exclude,$first,$table) {
1572+
protected function filterFieldsByExclude($fields,$exclude,$keep,$first,$table) {
15631573
if ($exclude) {
15641574
$columns = explode(',',$exclude);
15651575
foreach (array_keys($fields) as $key) {
1566-
$keep = true;
1576+
$delete = false;
15671577
foreach ($columns as $column) {
15681578
if (strpos($column,'.')) {
15691579
if ($column=="$table.$key" || $column=="$table.*") {
1570-
$keep = false;
1580+
$delete = true;
15711581
}
15721582
} elseif ($first) {
15731583
if ($column==$key || $column=="*") {
1574-
$keep = false;
1584+
$delete = true;
15751585
}
15761586
}
15771587
}
1578-
if (!$keep) unset($fields[$key]);
1588+
if ($delete && !isset($keep[$table][$key])) {
1589+
unset($fields[$key]);
1590+
}
15791591
}
15801592
}
15811593
return $fields;
@@ -1650,8 +1662,7 @@ protected function getParameters($settings) {
16501662

16511663
// reflection
16521664
list($tables,$collect,$select) = $this->findRelations($tables,$database,$auto_include);
1653-
$columns = $this->addRelationColumns($columns,$select);
1654-
$fields = $this->findFields($tables,$columns,$exclude,$database);
1665+
$fields = $this->findFields($tables,$columns,$exclude,$select,$database);
16551666

16561667
// permissions
16571668
if ($table_authorizer) $this->applyTableAuthorizer($table_authorizer,$action,$database,$tables);
@@ -2039,7 +2050,7 @@ protected function swagger($settings) {
20392050

20402051
foreach ($tables as $t=>$table) {
20412052
$table_list = array($table['name']);
2042-
$table_fields = $this->findFields($table_list,false,$database);
2053+
$table_fields = $this->findFields($table_list,false,false,false,$database);
20432054
$table_names = array_map(function($v){ return $v['name'];},$tables);
20442055

20452056
if ($extensions) {

0 commit comments

Comments
 (0)