毎月の手数料を表示しようとしています。 12か月すべてを表示し、各月の合計を表示します。私は1月から始めましたが、これは私が欲しいものに到達するのに近づいています。 Joomla 3.9、Platform 13.1.0を使用しています。
それぞれにJanに255のレコードが2つあるので、適切な合計を取得しています。
これは私のphpコードで得ている結果です:
フィールド名:jan
SUM(フィールド値):510
私はそれを見せたいだけです:
jan 51
これが私のコードです:
$db = JFactory::getDBO();
$query = "SELECT FieldName, SUM(FieldValue) FROM jos_rsform_submission_values WHERE FieldName=\"Jan\"';
$db -> setQuery($query);
$results = $db -> loadObjectList();
foreach($results as $value){
foreach($value as $key => $data){
echo $key.': '.$data."<br />";
}
echo "<br />";
}
3文字の月の完全な配列をハードコーディングすることから始めます。次に、それらの月をキーとして、すべての値がゼロの配列を作成します。
次に、データベースに既存の金額をクエリします。あなたは年が経つにつれて年固有のデータを分離する方法を持ちたいと思うでしょう。少なくとも、同じテーブルの無関係なデータを誤って含めないように、FormId
でフィルタリングする必要があります。 (デモでは_99
_を追加します。)
クエリした後、見つかった月のゼロの金額に新しく見つかった金額を追加します。
すべての計算が完了したら、準備したデータをループして月とその合計を表示します。
すべての月をリストしないと、データベーステーブルに存在する月のみが表示されます。このソリューションは、一貫して12か月を提供します。
注:$query->dump()
または$e->getMessage()
を一般に公開しないでください!これは純粋に、私のスクリプトから開発しているときにコーディングの間違いを診断するのに役立ちます。スクリプトが機能したら、2つのJFactory::getApplication()->enqueueMessage()
行をコメント化します。
テスト済みコード:
_$months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
$monthlySums = array_fill_keys($months, 0);
$db = JFactory::getDBO();
$query = $db->getQuery(true)
->select("FieldName, SUM(FieldValue) AS Sum")
->from("#__rsform_submission_values")
->where([
"FormId = 99",
"FieldName IN (" . implode(',', $db->q($months)) . ")"
])
->group("FieldName");
JFactory::getApplication()->enqueueMessage($query->dump(), 'info'); // never show dump() to public
try {
$db->setQuery($query);
$objects = $db->loadObjectList();
foreach ($objects as $object) {
$monthlySums[$object->FieldName] += $object->Sum;
}
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage("Query Syntax Error: " . $e->getMessage(), 'error'); // never show getMessage() to public
}
foreach ($monthlySums as $month => $sum) {
echo "<div>{$month}: {$sum}</div>";
}
_
FieldNameに月の名前があり、FieldValueに手数料の値があると仮定します。このようなレコードのサブセットに対してSQL COUNTまたはSUMを実行する場合、GROUP BY句が必要です。
また、loadObjectList()はオブジェクトの配列を返し、オブジェクトごとにオブジェクトプロパティが選択した列と一致します。
だからこれを試してください:
$db = JFactory::getDBO();
$query = "SELECT FieldName AS `month`, SUM(FieldValue) AS `commission` FROM jos_rsform_submission_values GROUP BY FieldName";
$db -> setQuery($query);
$results = $db -> loadObjectList();
foreach($results as $row)
{
echo $row->month . ': ' . $row->commission . '<br>';
}
https://docs.joomla.org/Selecting_data_using_JDatabase を参照してください