it-swarm.com.de

getListQuery: Ruft Werte von einer anderen Methode ab

Ich möchte meine getListQuery-Methode erweitern. Im Moment wähle ich Daten aus MySQL wie folgt:

$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');

Nun, jetzt möchte ich für jedes Ergebnis, das ich erhalte, Informationen von einem anderen Modell erhalten UND ich möchte weiterhin die Sortiermethoden verwenden.

Mein erster Versuch war, getListQuery zu verwenden und getItems () wie folgt zu überschreiben:

/**
 * 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;
}

Das funktioniert gut - die Ansicht kann auf "totalsum" zugreifen, aber natürlich kann ich das Sortieren und Suchen für dieses Pseudofeld nicht verwenden

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

meiner Ansicht nach.

Irgendwelche Ideen, um das zu lösen?

2
MyFault

Ich gehe davon aus, dass Sie 2 Tabellen haben und eine Liste von Elementen aus Tabelle 1 anzeigen möchten, aber auch einige Daten aus Tabelle 2 (wie die Gesamtsumme) für jedes Element .

Wenn Sie die Standard-Joomla-Funktionalität verwenden möchten, müssen Sie die Gesamtsumme in Ihrer Listenabfrage für die erste Tabelle abrufen. Dies kann mit Hilfe von Unterauswahlen ( MySQL-Unterabfragen ) geschehen. Sie können die Joomla-Sortierfunktionen nicht verwenden, wenn Sie Daten aus der zweiten Tabelle wie derzeit über PHP zuweisen.

Ihre Anfrage würde ungefähr so ​​aussehen:

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

Das Sortierfeld könnte dann so aussehen:

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

Gerne bearbeite/verbessere ich diese Antwort, wenn Sie weitere Informationen zur Verfügung stellen.

3
fruppel