web-dev-qa-db-fra.com

Comment afficher les noms des parents au lieu de leurs identifiants

Je crée mon composant personnalisé. En arrière-plan, j'ai la liste des enregistrements individuels. Ils ont des enregistrements parent dans la base de données sous le nom parent_id et ne sont donc affichés dans le back-end qu'en tant qu'id. Comment afficher les noms de ces parents au lieu de leurs identifiants?

Dans mon modèles/records.php il y a la requête:

$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('id, header, parent_id, ordering, published');
$query->from('#__records');
return $query;

et dans views/records/view.html.php il y a $this->items = $this->get('Items'); Les noms des enregistrements sont stockés dans le DB dans le champ en-tête

2
stckvrw

Utilisez la sous-requête.

SELECT 
    *,
    (SELECT header FROM `tablename` WHERE `id`=r.parent_id) AS parent_header
FROM 
    `tablename` AS r

parent_header a le nom de l'enregistrement parent.

Avec Joomla! JDatabaseQuery objet

$db = JFactory::getDBO();

// Create subquery to get `header` column value
$subQuery = $db->getQuery(true)
    ->select('header')
    // You have this row in same table? If not, change table name
    ->from('`#__records`')
    ->where('id=r.parent_id');

$query = $db->getQuery(true)
  ->select('id, header, parent_id, ordering, published')
  // Inject subquery select
  ->select('('.$subQuery->__toString().') AS parent_header')
  ->from('`#__records` AS r');

return $query;

Sortie de la requête:

SELECT 
    id, header, parent_id, ordering, published,
    (
        SELECT 
            header
        FROM 
            `lab0f_records`
        WHERE 
            id=r.parent_id
    ) AS 
        parent_header
FROM 
    `lab0f_records` AS r
3
Rene Korss

Vous devez laisser rejoindre le nom de l'en-tête lorsque vous créez la requête dans votre méthode modèle getListQuery (). Le code actuel utilisant l'objet de requête Joomla ressemble à ceci:

$query->select('a.id, a.header, a.parent_id, a.ordering, a.published');
$query->from('#__records AS a');

$query->select('p.header as parent_name');
$query->join('LEFT', '#__records AS p ON p.id = a.parent_id');

Ce serait le moyen officiel de Joomla de saisir et d'utiliser le nom réel par rapport à un identifiant. Vous pouvez accéder au nom du nom parent en utilisant les éléments suivants dans vos vues:

$this->item->parent_name

Il est déconseillé d'utiliser une syntaxe pure de MySQL, en particulier si vous envisagez de transférer ce composant dans JED (Joomla Extension Directory) car il ne fonctionnera pas avec les installations Joomla n'utilisant pas MySQL.

En utilisant exclusivement les classes d'abstraction de base de données Joomla pour gérer toutes les opérations de base de données CRUD, vous vous assurez que le code de votre composant peut fonctionner avec toute base de données prise en charge utilisée par toute installation Joomla particulière.

J'espère que cela t'aides!

5
Brian Bolli