在我的Product模型中,我有以下两种方法: getOrderFeedback()是返回ActiveQuery的正常关系,而getTotalAndAveFeedback()返回给定Product记录的汇总数据数组。/** * @return \yii\db\ActiveQuery */public function getOrderFeedback(){ return $this->hasMany(OrderFeedback::className(), ['productID' => 'ID']);}/** * @return array */public function getTotalAndAveFeedback(){ return $this->getOrderFeedback() ->select(['COUNT(*) AS num', 'AVG(rating) AS avg', 'FLOOR(AVG(rating)) AS full', 'MOD(AVG(rating), 1) AS decimal_portion', '5 - FLOOR(AVG(rating)) - CEILING(MOD(AVG(rating),1)) AS empty'])->one();}当我有一组Product并对其进行迭代以为单个totalAndAveFeedback收集Product时,会触发ActiveQuery,从而导致从数据库读取延迟的样式。类似于以下内容$my_products = Product::find()->with(['supplier', 'location']) ->where(['published' => 1]) ->all();# SELECT * FROM product WHERE published = 1;# Find all products# SELECT * FROM supplier WHERE ID IN (s1, s2, s3);# Eagerly load supplier# SELECT * FROM location WHERE ID IN (l1, l2, l3, l4);# Eagerly load locationforeach ($my_products as $product) { echo $product->supplier->supplier_name; # supplier object available from eager loading echo $product->location->title; # location object available from eager loading echo $product->totalAndAveFeedback->decimal_portion; # requires db access to 'lazy load' data for each product record # SELECT COUNT(*) AS num, AVG(rating) AS avg, FLOOR(AVG(rating)) AS full, MOD(AVG(rating), 1) AS decimal_portion, 5 - FLOOR(AVG(rating)) - CEILING(MOD(AVG(rating),1)) AS empty FROM `order_feedback` WHERE `productID`=pID}有没有一种方法可以将getTotalAndAveFeedback()视为允许在joinWith() with()上使用Product / ActiveQuery的关系,以便可以为每个Product急切加载数据,并以与或Supplier关系?我尝试在Location中删除​​对one()的调用,以允许将该方法视为关系,但是getTotalAndAveFeedback()记录的totalAndAveFeedback属性都是空数组,我希望有一个对象诸如Product之类的属性,就好像我将其称为decimal_portion之类的简单关系一样。Yii2有可能吗? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 /** * @return \yii\db\ActiveQuery */public function getTotalAndAveFeedback(){ return $this->getOrderFeedback() ->select(['productID', 'COUNT(*) AS num', 'AVG(rating) AS avg', 'FLOOR(AVG(rating)) AS full', 'MOD(AVG(rating), 1) AS decimal_portion', '5 - FLOOR(AVG(rating)) - CEILING(MOD(AVG(rating),1)) AS empty']) ->groupBy(['productID']);}正如@ Pa3Py6aka指出的那样,在加入关系时数组为空的原因是未选择productID,因此返回的OrderFeedback和Product之间没有链接。通过将groupBy(['productID'])方法调用添加到ActiveQuery中,每个OrderFeedbacks都会被急切加载,并且各个Product对象可以访问。关于php - 聚合数据组作为Yii2关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43788317/ (adsbygoogle = window.adsbygoogle || []).push({});
10-09 22:22
查看更多