Laravel Eloquent: получение данных, соответствующих условию

Я составляю план диеты с помощью Laravel 8; база данных выглядит так:

Рецепты Категория Калории яблочный пирог закуски 289 Банановый пирог закуски 386 Томатная паста обед 712 Куриный салат обед 756 Овощной суп ужин 410 Рыба с картофелем ужин 652

Я хотел бы случайным образом выбирать блюда на день, устанавливая верхний предел суммы столбца калорий.

Например, если мой лимит составляет 1500, я хочу получить рецепт из каждой из 3 категорий (обед/ужин/закуски), общее количество calories которых в столбце не превышает 1500.

Как я могу сделать это с помощью Laravel Eloquent?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Получить все рецепты для каждой категории еды (закуски, обед, ужин). Рассчитайте все возможные комбинации рецептов для каждой категории блюд. Фильтруйте комбинации, в которых общее количество калорий не превышает дневной лимит калорий. Выберите по одной комбинации из каждой категории питания, чтобы составить ежедневный план питания.


use App\Models\Recipe;

// Function to generate combinations of recipes
function generateCombinations($items, $n, $start = 0, $result = [], &$results = []) {
    if ($n === 0) {
        $results[] = $result;
        return;
    }

    for ($i = $start; $i < count($items); $i++) {
        $result[] = $items[$i];
        generateCombinations($items, $n - 1, $i + 1, $result, $results);
        array_pop($result);
    }
}

// Function to filter combinations by total calories
function filterCombinationsByCalories($combinations, $dailyCalories) {
    return array_filter($combinations, function($combination) use ($dailyCalories) {
        $totalCalories = array_sum(array_column($combination, 'calories'));
        return $totalCalories <= $dailyCalories;
    });
}

// Function to get daily meal plan
function getDailyMealPlan($dailyCalories) {
    $mealCategories = ['snacks', 'lunch', 'dinner'];
    $mealPlan = [];

    foreach ($mealCategories as $category) {
        $recipes = Recipe::where('category', $category)->get()->toArray();

        // Generate combinations of recipes for this meal category
        $combinations = [];
        generateCombinations($recipes, 1, 0, [], $combinations);

        // Filter combinations by total calories
        $filteredCombinations = filterCombinationsByCalories($combinations, $dailyCalories);

        // If there are no valid combinations, choose a single recipe with the highest calories
        if (empty($filteredCombinations)) {
            $selectedRecipe = Recipe::where('category', $category)->orderBy('calories', 'desc')->first();
            $mealPlan[$category] = $selectedRecipe;
        } else {
            // Randomly select a combination from the filtered combinations
            $selectedCombination = $filteredCombinations[array_rand($filteredCombinations)];
            $mealPlan[$category] = $selectedCombination;
        }
    }

    return $mealPlan;
}

// Example usage
$dailyCalories = 1500;
$mealPlan = getDailyMealPlan($dailyCalories);
print_r($mealPlan);

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

Действительно мило! Этот метод более продвинут и отлично работает. Я многому научился благодаря вашим функциям. Спасибо!

Rubyx 25.04.2024 09:51

Сначала вам следует указать пороговое значение ваших ежедневных калорий, а затем, когда запрос найдет случайный рецепт, вам следует уменьшить оставшиеся калории на количество калорий, содержащихся в этом рецепте. Сделайте это для каждой категории.

$dailyCalories = 1500; //Calory limit threshold

$snack = Recipe::where('category', 'snacks')
    ->where('calories', '<', $dailyCalories / 3) // divide by 3 for a rough estimate
    ->inRandomOrder()
    ->first();

$remainingCalories = $dailyCalories - $snack->calories;

$lunch = Recipe::where('category', 'lunch')
    ->where('calories', '<', $remainingCalories / 2) // Divide by 2 for a rough estimate
    ->inRandomOrder()
    ->first();
$remainingCalories -= $lunch->calories;

$dinner = Recipe::where('category', 'dinner')
    ->where('calories', '<', $remainingCalories)
    ->inRandomOrder()
    ->first();

Очень интересный и простой метод! Некоторые ограничения, потому что мне придется разделить, и некоторые рецепты будут исключены. Спасибо, что поделились!

Rubyx 25.04.2024 09:49

Цените ваш отзыв.

Scarlet D. 25.04.2024 10:40

При этом не будут выбраны закуски с калорийностью более 500 калорий.

gre_gor 21.05.2024 23:48

Другие вопросы по теме