Modifier la structure d'un tableau multidimensionnel généré par SQL via $ wpdb
La sortie dont j'ai besoin de $wpdb
est facilement réalisable en exécutant plusieurs requêtes dans foreach
. Cependant, j'essaie d'éviter la même chose pour les problèmes de performances.
J'ai deux tables personnalisées:
items
- item_id
- item_name
sub_items
- sub_item_id
- item_id
- sub_item_name
La requête que je cours:
$items_tbl = $wpdb->prefix . 'items';
$sub_items_tbl = $wpdb->prefix . 'sub_items';
$results = $wpdb->get_results($wpdb->prepare("SELECT * from $sub_items_tbl LEFT JOIN $items_tbl ON $items_tbl.item_id = $sub_items_tbl.item_id"), ARRAY_A);
Voici le résultat résultant de la requête ci-dessus:
array(
[0] => array(
['sub_item_id'] => 1
['item_id'] => 1
['sub_item_name'] => 'Lorem Ipsum'
['item_name'] => Some Item Name
)
[1] => array(
['sub_item_id'] => 2
['item_id'] => 1
['sub_item_name'] => 'Lorem Ipsum Ornare Parturient'
['item_name'] => Some Item Name
)
[2] => array(
['sub_item_id'] => 3
['item_id'] => 2
['sub_item_name'] => 'Lorem Ipsum Adipiscing Malesuada'
['item_name'] => Some Item Name
)
[3] => array(
['sub_item_id'] => 4
['item_id'] => 2
['sub_item_name'] => 'Lorem Ipsum Ligula'
['item_name'] => Some Item Name
)
[4] => array(
['sub_item_id'] => 5
['item_id'] => 2
['sub_item_name'] => 'Lorem Ipsum Sit Adipiscing'
['item_name'] => Some Item Name
)
)
Et voici le résultat dont j'ai besoin:
array(
[0] => array(
['item_id'] => 1
['item_name'] => Some Item Name
['sub_items'] =>[0] => array(
['sub_item_id'] => 1
['sub_item_name'] => 'Lorem Ipsum'
)
[1] => array(
['sub_item_id'] => 2
['sub_item_name'] => 'Lorem Ipsum Ornare Parturient'
)
)
[1] => array(
['item_id'] => 2
['item_name'] => Some Item Name
['sub_items'] =>[0] => array(
['sub_item_id'] => 3
['sub_item_name'] => 'Lorem Ipsum Adipiscing Malesuada'
)
[1] => array(
['sub_item_id'] => 4
['sub_item_name'] => 'Lorem Ipsum Ligula'
)
[2] => array(
['sub_item_id'] => 5
['sub_item_name'] => 'Lorem Ipsum Sit Adipiscing'
)
)
)
Je préférerais de préférence modifier le code SQL pour obtenir la sortie résultante. Cependant, si cela ne peut pas être réalisé, comment modifier le résultat en PHP?
Vous pouvez le faire de deux manières, autant que je sache:
Utilisez PHP pour combiner les résultats actuels avec ceux de votre choix. Fondamentalement:
$ records = array ();
foreach( $results as $result )
{
$record_id = $result['item_id'];
if (empty($records[$record_id])) {
$records[$record_id]['item_id'] = $result['item_id'];
$records[$record_id]['item_name'] = $result['item_name'];
$records[$record_id]['sub_items'] = array();
}
$records[$record_id]['sub_items'][] = array(
'sub_item_id' => $result['sub_item_id'],
'sub_item_name' => $result['sub_item_name']
);
}
L'autre moyen est de faire 2 requêtes. le premier trouve les objets principaux. Une fois que vous avez les identifiants d’éléments des éléments principaux, vous effectuez une requête secondaire dans laquelle vous obtenez tous les sous-éléments dont le paramètre item_id se trouve dans ceux que vous avez précédemment interrogés. Ensuite, vous utilisez PHP pour le regrouper dans des tableaux imbriqués, comme pour la première option.
Autant que je sache, vous ne pouvez pas créer de résultats imbriqués dans mySQL comme vous le souhaitez, vous devez donc faire le travail de synthèse en PHP.