Ich habe Order- und OrderSearch-Modelle.
In der Liste (actionIndex) mit GridView gibt es eine Filterung und Sortierung. Eine der Spalten in Order ist order_total (Summe aller Produkte in der richtigen Reihenfolge).
Ich muss SUM aller order_total in GridView implementieren. Wenn ich es manuell mache, indem ich ActiveDataProvider-> getModels() mit array_map zähle, verbringe ich 3 Sekunden für 3000 Aufträge (localhost). Ich möchte nicht so viel Zeit verpassen.
Ich sehe zwei Möglichkeiten, um es schneller zu machen:
- erstellen Cache für jeden Filter und aktualisieren Sie es durch Lebensdauer (schrecklich)
- Das interessanteste, dass ich es richtig in OrderSearch- tun können> Suche () Methode als $ query-Methode. Aber ich verstehe nicht, wie ich es in einem Controller weitergeben kann.
Beispiel für einen Code für die 2. Art und Weise:
class OrderSearch extends Order
{
public $totalSum;
public function search($params)
{
$query = Order::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$this->load($params);
$this->totalSum = $query->sum('order_total'); // this works very fast
return $dataProvider;
}
}
Danach versuche ich diese Eigenschaft im Controller zu bekommen:
public function actionIndex()
{
$searchModel = new OrderSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
$dataProvider->pagination->pageSize = 100;
// code below works too slow and depends on pagination page size
// $orders = $dataProvider->getModels();
// $totalSum = 1.0;
// array_map(function($item) use (&$totalSum) {
// $totalSum += (float)$item->attributes['order_total'];
// }, $dataProvider->getModels());
// here I get an error
// Unknown Property – yii\base\UnknownPropertyException
// Getting unknown property: yii\data\ActiveDataProvider::totalSum
$totalSum = $dataProvider->totalSum;
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'totalSum' => $totalSum,
]);
}
Wie kann ich benutzerdefinierte Eigenschaft für Data Provider festgelegt?
Verwenden '$ totalSum = $ searchModel [ 'totalSum'];' in Ihrem Controller anstatt '$ totalSum = $ dataProvider-> totalSum;' –
Vielen Dank! Es war einfacher als ich dachte :)))) – dearmisterrobot