web-dev-qa-db-fra.com

getListQuery: Obtenir les valeurs d'une autre méthode

J'aimerais développer ma méthode getListQuery. Au moment où je choisis les données de mysql comme ceci:

$query->select(*);
$query->from('`#__hero_invoices` AS a');

// Join over the invoice-data
$query->select("SUM(ip.factor * ip.value) as totalsum");
$query->join("LEFT", "#__hero_invoices_positions AS ip ON ip.invoiceid=a.id");                 

// Join over the ordermapping-data
$query->select("om.orderid");
$query->join("LEFT", "#__hero_invoices_mapping AS om ON om.invoiceid=a.id");

// Join over the order-data
$query->select("o.userid as userid");
$query->join("LEFT", "#__hero_orders AS o ON o.id=om.orderid"); 

// Join over the customer-data
$query->select("c.lastname as customer_lastname, c.firstname as customer_firstname, c.company as customer_company");
$query->join("LEFT", "#__hero_customers AS c ON c.userid=o.userid");        

// Join over the users for the checked out user
$query->select("uc.name AS editor");
$query->join("LEFT", "#__users AS uc ON uc.id=a.checked_out");

// Join over the user field 'created_by'
$query->select('created_by.name AS created_by');
$query->join('LEFT', '#__users AS created_by ON created_by.id = a.created_by');

Eh bien - j'aimerais maintenant obtenir des informations d'un autre modèle pour chaque résultat obtenu ET j'aimerais continuer à utiliser les méthodes de tri.

Mon premier essai a été d'utiliser getListQuery et d'écraser getItems () comme ceci:

/**
 * getItems function.
 * 
 * @access public
 * @return void
 */
public function getItems() 
{
    $modelinvoice           =       JModelLegacy::getInstance( 'Invoice', 'HeroModel' );

    $items                  =       parent::getItems();


    foreach($items as $item)
    {
        $invoice            =   $modelinvoice->getItem($item->id);
        $item->totalsum     =   $invoice->totalsum;
    }


    return $items;
}

Cela fonctionne bien - la vue peut accéder à "totalsum", mais bien sûr, je ne peux pas utiliser le tri et la recherche de ce pseudo-champ à l'aide de

echo JHtml::_('searchtools.sort', 'COM_HERO_HEADING_TOTALSUM', 'a.totalsum', $listDirn, $listOrder);

à mon avis.

Des idées pour résoudre ceci?

2
MyFault

Je suppose que vous avez 2 tables et que vous souhaitez afficher une liste d’articles du tableau 1, mais ajoutez également des données du tableau 2 (comme la somme totale) pour chaque élément .

Si vous souhaitez utiliser la fonctionnalité par défaut de Joomla, vous devez obtenir la somme totale dans votre requête de liste pour la première table. Cela peut être fait avec l'aide de sous-sélections ( sous-requêtes MySQL ). Vous ne pourrez pas utiliser les fonctions de tri Joomla si vous affectez des données de la deuxième table via PHP comme vous le faites actuellement).

Votre requête ressemblerait à ceci:

SELECT 
    a.field1, 
    a.field2, 
   (SELECT SUM(b.field3) FROM table2 AS b WHERE b.table1_id = a.id) AS totalsum
FROM 
    table1 AS a

Le champ de tri pourrait ressembler à ceci alors:

echo JHtml::_('searchtools.sort', 'COM_HERO_HEADING_TOTALSUM', 'totalsum', $listDirn, $listOrder)

Je suis heureux de modifier/améliorer cette réponse si vous fournissez plus d'informations.

3
fruppel