Laravel 5.7 Макет дизайна базы данных / Среднее из коллекции - PullRequest
0 голосов
/ 12 января 2019

У меня есть ситуация, когда у каждого 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'));
}

Но он возвращает не среднее значение id, поскольку вычисляет среднее значение, а не то, что мне нужно для вычисления. Есть ли лучший способ, потому что я думаю, что это не самый умный способ сделать это. Является ли дизайн моей базы данных "лучшим" способом справиться с этим?


1 Ответ

0 голосов
/ 12 января 2019

Тип усреднения, который вы ищете здесь: mode . Экземпляры коллекции Laravel имеют метод mode () , который был представлен в 5.2 и который при предоставлении ключа возвращает массив, содержащий наибольшее значение для этого ключа.


Если я правильно понял ваш вопрос, это должно дать вам то, что вы ищете:

$result->userFeedbacks
    ->flatMap->packagingFeedbacks
    ->groupBy('type_id')
    ->map->mode('id');

Выше используются преимущества flatMap () и сообщений более высокого порядка () для коллекций.

...