Laravel 5.7数据库设计布局/取平均值

时间:2019-01-12 09:21:42

标签: laravel eloquent laravel-5.7 laravel-collection

我遇到这样的情况:每个Order可以有Feedback.,如果产品是物理的,则Feedback可以有很多packaging_feedbacks. packaging_feedbacks应该是与packaging_feedback_details.

有关系

反馈模型

public function packagingFeedbacks()
{
    return $this->hasManyThrough('App\PackagingFeedbackDetail', 'App\PackagingFeedback',
        'feedback_id', 'id', 'id', 'user_selection');
}

packaging_feedback_details
id|type_id(used to group the "names" for each feedback option)|name
1  0                                                            well packed
2  0                                                            bad packaging
3  1                                                            fast shipping
4  1                                                            express delivery

packaging_feedbacks
id|feedback_id|user_selection (pointing to the ID of packaging_feedback_details)
1   1           2
2   1           6
3   1           7
4   1           12
5   1           15
6   1           17
7   2           1
8   2           6
9   2           7
10  2           12
11  2           15
12  2           17
13  3           1
14  3           6
15  3           7
16  3           12
17  3           15
18  3           17

现在,我希望能够获得物理产品用户的平均选择。我开始使用:

$result = Product::with('userFeedbacks.packagingFeedbacks')->where('id', 1)->first();
$collection = collect();

foreach ($result->userFeedbacks as $key) {
    foreach ($key->packagingFeedbacks as $skey) {
        $collection->push($skey);
    }
}

foreach ($collection->groupBy('type_id') as $key) {
    echo($key->average('type_id'));
}

但是它不返回平均值,因为它将计算平均值而不是我需要的平均值。有没有更好的方法,因为我认为这不是最聪明的方法。通常,我的数据库设计是处理此问题的“最佳”方法吗?


1 个答案:

答案 0 :(得分:0)

您要在此处查找的平均值类型为模式。 Laravel的集合实例具有5.2中引入的mode()方法,当提供键时,该方法将返回包含该键的最高出现值的数组。


如果我正确理解了您的问题,这应该给您带来的帮助:

class GameViewController: UIViewController {

    var dynamicAnimator : UIDynamicAnimator!
    var collisionBehavior : UICollisionBehavior!
    var gravityBeehavior : UIGravityBehavior!

    @IBOutlet weak var aeroplane: UIImageView!
    @IBOutlet weak var crow1: UIImageView!
    @IBOutlet weak var crow2: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()




        dynamicAnimator = UIDynamicAnimator(referenceView: self.view)

        gravityBeehavior = UIGravityBehavior(items: [crow2])
        dynamicAnimator.addBehavior(gravityBeehavior)

        collisionBehavior = UICollisionBehavior(items: [crow1, crow2])
        collisionBehavior.translatesReferenceBoundsIntoBoundary = true
        dynamicAnimator.addBehavior(collisionBehavior)
}

以上内容利用了集合中的flatMap()higher order messages()