web-dev-qa-db-fra.com

Deux jointures à gauche et plusieurs parents pour un seul enregistrement

Ce problème est une extension de la (des) question (s) par le lien joomla.stackexchange.com/a/9836/4042 mais avec une condition lorsque l'enregistrement enfant a non seulement UN parent (enregistrement parent) mais BEAUCOUP.

Avec deux jointures à gauche de la réponse acceptée par ce lien, cela fonctionne parfaitement si l'enregistrement enfant n'a qu'un seul parent (ou que plusieurs enfants sont liés au même parent ONE). Mais qu'en est-il du cas lorsqu'un enregistrement enfant est lié à plusieurs parents (enregistrements parent)? C'est à dire:

#__ enregistrements:

id  name
1   Child1
2   Parent1
3   Parent2

#__ parents:

id  child_id  parent_id
1       1         2
2       1         3

En utilisant ces deux jointures à gauche pour ce cas, j'obtiens deux fois le même enregistrement enfant dans la liste d'enregistrements au niveau du back-end pour chaque nom parent:

ID  CHILD    PARENT
1   Child1   Parent1
1   Child1   Parent2

Donc, il y a deux questions:

1. Comment pousser le parent_name vers array () et pour obtenir la liste des enregistrements enfants à la fin de mon composant (si () administrateur/index.php? com_mycom & view = recordS ) comme:

ID CHILD   PARENT
1  Child1  Parent1, Parent2

2. Comment obtenir le champ avec un tableau de parents dans le formulaire permettant de modifier un seul enregistrement et comment (ré) enregistrer le champ dans la base de données ( si administrateur/index.php? com_mycom & view = enregistrement & mise en page = éditer & id = 1 )? J'essaie d'ajouter à mon admin/models/forms/record.xml le champ comme:

<field 
    name="parentheader"
    type="list"
    label="COM_MYCOM_PARENT"
    description=""
    class="chzn-color-state"
    multiple="multiple">
    <option value="0">COM_MYCOM_SELECT_PARENT</option>
</field>

et pour le rendre dans tmpl avec celui-ci:

JHtml::_('formbehavior.chosen', 'select');
...
<div class="control-group">
   <div class="control-label">
      <?php echo $this->form->getLabel('parentheader'); ?>
   </div>
   <div class="controls">
     <?php echo $this->form->getInput('parentheader'); ?>
   </div>
</div>

Mais je reçois cette sortie: enter image description here

Ce doit être comme le champ pour les catégories dans le panneau d'édition de produit de Virtuemart où je peux lier un produit à plusieurs catégories:

enter image description here

Quel code dois-je ajouter à mon admin/models/forms/record.xml et à admin/models/record. php (ou à la classe JTable)?

1
stckvrw

Je peux vous aider avec la réponse à Q1 (le SQL).

Voici le code SQL que j'ai utilisé sur sqlfiddle :

SELECT
  b.`child_id`,
  a.`name`,
  GROUP_CONCAT( c.`name` ORDER BY c.`name` SEPARATOR ', ') AS parents
FROM `a_parents` AS b
INNER JOIN `a_records` AS a ON a.`id`=b.`child_id`
INNER JOIN `a_records` AS c ON c.`id`=b.`parent_id`
GROUP BY b.`child_id`;

Il suppose ce qui suit:

  • vous ne vous intéressez qu'aux enfants qui ont des parents (la table des parents est donc "Origine", si vous voulez - groupage par child_id)
  • il devrait pouvoir accueillir plus de deux parents (en supposant qu'il ne s'agisse pas d'ascendance humaine, sinon la filiation tripartite/polypartite dépasse de loin le cadre d'un échange superposable!)
  • la longueur totale des noms des parents ne dépasse pas 1024 (le cas échéant, vous devrez faire quelque chose comme:

    SET group_concat_max_len = 1024 * 10;

pour le définir à 10K, par exemple - ceci est fait avant le SELECT)

  • L'alias c est utilisé pour permettre de mapper le nom du parent sur parent_id
  • Utilisation de MySQL 5.5 ou version ultérieure - les versions antérieures peuvent également fonctionner

Le nœud de la solution ici est l’utilisation de GROUP_CONCAT , ce qui évite de recourir à un traitement de tableau PHP pour "convertir" plusieurs lignes en une seule colonne.


En ce qui concerne la deuxième question (Q2), vous aurez probablement besoin d'écrire un gestionnaire de champ personnalisé. Je suppose que vous ne dites pas, mais si vous utilisez VM dans la manière dont vous avez effectué la capture d'écran, cela ressemble à J2.5 (plutôt qu'à J3), il y a de nombreux exemples où VM2 utilise ses propres champs spéciaux (voir administrateur /.../ éléments pour des exemples, si je me souviens bien et peut-être aussi administrateur /.../ modèles/champs). Les liens ici pour écrire du back-end personnalisé les champs pourraient aider

2
Mark Bradley