@@ -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