@@ -1527,33 +1527,12 @@ protected function addRelationColumns($columns,$select) {
15271527 return $ columns ;
15281528 }
15291529
1530- protected function excludeFields ($ fields ,$ exclude ) {
1531- if ($ fields && $ exclude ) {
1532- $ columns = explode (', ' ,$ exclude );
1533- foreach ($ columns as $ column ) {
1534- $ table = "" ;
1535- if (strpos ($ column ,'. ' )) {
1536- $ key = explode ('. ' ,$ column );
1537- $ table = $ key [0 ];
1538- $ column = $ key [1 ];
1539- } else {
1540- if (count ($ fields )==1 ) {
1541- $ table = array_keys ($ fields )[0 ];
1542- }
1543- }
1544- if (array_key_exists ($ table ,$ fields ) and array_key_exists ($ column ,$ fields [$ table ])) {
1545- unset($ fields [$ table ][$ column ]);
1546- }
1547- }
1548- }
1549- return $ fields ;
1550- }
1551-
1552- protected function findFields ($ tables ,$ columns ,$ database ) {
1530+ protected function findFields ($ tables ,$ columns ,$ exclude ,$ database ) {
15531531 $ fields = array ();
15541532 foreach ($ tables as $ i =>$ table ) {
15551533 $ fields [$ table ] = $ this ->findTableFields ($ table ,$ database );
15561534 $ fields [$ table ] = $ this ->filterFieldsByColumns ($ fields [$ table ],$ columns ,$ i ==0 ,$ table );
1535+ $ fields [$ table ] = $ this ->filterFieldsByExclude ($ fields [$ table ],$ exclude ,$ i ==0 ,$ table );
15571536 }
15581537 return $ fields ;
15591538 }
@@ -1580,6 +1559,28 @@ protected function filterFieldsByColumns($fields,$columns,$first,$table) {
15801559 return $ fields ;
15811560 }
15821561
1562+ protected function filterFieldsByExclude ($ fields ,$ exclude ,$ first ,$ table ) {
1563+ if ($ exclude ) {
1564+ $ columns = explode (', ' ,$ exclude );
1565+ foreach (array_keys ($ fields ) as $ key ) {
1566+ $ keep = true ;
1567+ foreach ($ columns as $ column ) {
1568+ if (strpos ($ column ,'. ' )) {
1569+ if ($ column =="$ table. $ key " || $ column =="$ table.* " ) {
1570+ $ keep = false ;
1571+ }
1572+ } elseif ($ first ) {
1573+ if ($ column ==$ key || $ column =="* " ) {
1574+ $ keep = false ;
1575+ }
1576+ }
1577+ }
1578+ if (!$ keep ) unset($ fields [$ key ]);
1579+ }
1580+ }
1581+ return $ fields ;
1582+ }
1583+
15831584 protected function findTableFields ($ table ,$ database ) {
15841585 $ fields = array ();
15851586 foreach ($ this ->db ->fetchFields ($ table ) as $ field ) {
@@ -1631,12 +1632,12 @@ protected function getParameters($settings) {
16311632 $ table = $ this ->parseRequestParameter ($ request , 'a-zA-Z0-9\-_ ' );
16321633 $ key = $ this ->parseRequestParameter ($ request , 'a-zA-Z0-9\-_, ' ); // auto-increment or uuid
16331634 $ action = $ this ->mapMethodToAction ($ method ,$ key );
1634- $ exclude = $ this ->parseGetParameter ($ get , 'exclude ' , 'a-zA-Z0-9\-_,. ' );
16351635 $ include = $ this ->parseGetParameter ($ get , 'include ' , 'a-zA-Z0-9\-_, ' );
16361636 $ page = $ this ->parseGetParameter ($ get , 'page ' , '0-9, ' );
16371637 $ filters = $ this ->parseGetParameterArray ($ get , 'filter ' , false );
16381638 $ satisfy = $ this ->parseGetParameter ($ get , 'satisfy ' , 'a-zA-Z0-9\-_,. ' );
16391639 $ columns = $ this ->parseGetParameter ($ get , 'columns ' , 'a-zA-Z0-9\-_,.* ' );
1640+ $ exclude = $ this ->parseGetParameter ($ get , 'exclude ' , 'a-zA-Z0-9\-_,.* ' );
16401641 $ orderings = $ this ->parseGetParameterArray ($ get , 'order ' , 'a-zA-Z0-9\-_, ' );
16411642 $ transform = $ this ->parseGetParameter ($ get , 'transform ' , 't1 ' );
16421643
@@ -1650,8 +1651,7 @@ protected function getParameters($settings) {
16501651 // reflection
16511652 list ($ tables ,$ collect ,$ select ) = $ this ->findRelations ($ tables ,$ database ,$ auto_include );
16521653 $ columns = $ this ->addRelationColumns ($ columns ,$ select );
1653- $ fields = $ this ->findFields ($ tables ,$ columns ,$ database );
1654- $ fields = $ this ->excludeFields ($ fields ,$ exclude );
1654+ $ fields = $ this ->findFields ($ tables ,$ columns ,$ exclude ,$ database );
16551655
16561656 // permissions
16571657 if ($ table_authorizer ) $ this ->applyTableAuthorizer ($ table_authorizer ,$ action ,$ database ,$ tables );
0 commit comments