@@ -1516,28 +1516,36 @@ protected function retrieveInputs($data) {
1516
1516
return is_array ($ input )?$ input :array ($ input );
1517
1517
}
1518
1518
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 ;
1525
1528
}
1526
1529
}
1527
- return $ columns ;
1530
+ return $ keep ;
1528
1531
}
1529
1532
1530
- protected function findFields ($ tables ,$ columns ,$ exclude ,$ database ) {
1533
+ protected function findFields ($ tables ,$ columns ,$ exclude ,$ select , $ database ) {
1531
1534
$ fields = array ();
1535
+ if ($ select && ($ columns || $ exclude )) {
1536
+ $ keep = $ this ->getRelationColumns ($ select );
1537
+ } else {
1538
+ $ keep = false ;
1539
+ }
1532
1540
foreach ($ tables as $ i =>$ table ) {
1533
1541
$ 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 );
1536
1544
}
1537
1545
return $ fields ;
1538
1546
}
1539
1547
1540
- protected function filterFieldsByColumns ($ fields ,$ columns ,$ first ,$ table ) {
1548
+ protected function filterFieldsByColumns ($ fields ,$ columns ,$ keep , $ first ,$ table ) {
1541
1549
if ($ columns ) {
1542
1550
$ columns = explode (', ' ,$ columns );
1543
1551
foreach (array_keys ($ fields ) as $ key ) {
@@ -1553,29 +1561,33 @@ protected function filterFieldsByColumns($fields,$columns,$first,$table) {
1553
1561
}
1554
1562
}
1555
1563
}
1556
- if ($ delete ) unset($ fields [$ key ]);
1564
+ if ($ delete && !isset ($ keep [$ table ][$ key ])) {
1565
+ unset($ fields [$ key ]);
1566
+ }
1557
1567
}
1558
1568
}
1559
1569
return $ fields ;
1560
1570
}
1561
1571
1562
- protected function filterFieldsByExclude ($ fields ,$ exclude ,$ first ,$ table ) {
1572
+ protected function filterFieldsByExclude ($ fields ,$ exclude ,$ keep , $ first ,$ table ) {
1563
1573
if ($ exclude ) {
1564
1574
$ columns = explode (', ' ,$ exclude );
1565
1575
foreach (array_keys ($ fields ) as $ key ) {
1566
- $ keep = true ;
1576
+ $ delete = false ;
1567
1577
foreach ($ columns as $ column ) {
1568
1578
if (strpos ($ column ,'. ' )) {
1569
1579
if ($ column =="$ table. $ key " || $ column =="$ table.* " ) {
1570
- $ keep = false ;
1580
+ $ delete = true ;
1571
1581
}
1572
1582
} elseif ($ first ) {
1573
1583
if ($ column ==$ key || $ column =="* " ) {
1574
- $ keep = false ;
1584
+ $ delete = true ;
1575
1585
}
1576
1586
}
1577
1587
}
1578
- if (!$ keep ) unset($ fields [$ key ]);
1588
+ if ($ delete && !isset ($ keep [$ table ][$ key ])) {
1589
+ unset($ fields [$ key ]);
1590
+ }
1579
1591
}
1580
1592
}
1581
1593
return $ fields ;
@@ -1650,8 +1662,7 @@ protected function getParameters($settings) {
1650
1662
1651
1663
// reflection
1652
1664
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 );
1655
1666
1656
1667
// permissions
1657
1668
if ($ table_authorizer ) $ this ->applyTableAuthorizer ($ table_authorizer ,$ action ,$ database ,$ tables );
@@ -2039,7 +2050,7 @@ protected function swagger($settings) {
2039
2050
2040
2051
foreach ($ tables as $ t =>$ table ) {
2041
2052
$ 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 );
2043
2054
$ table_names = array_map (function ($ v ){ return $ v ['name ' ];},$ tables );
2044
2055
2045
2056
if ($ extensions ) {
0 commit comments