Я составляю план диеты с помощью Laravel 8; база данных выглядит так:
Я хотел бы случайным образом выбирать блюда на день, устанавливая верхний предел суммы столбца калорий.
Например, если мой лимит составляет 1500, я хочу получить рецепт из каждой из 3 категорий (обед/ужин/закуски), общее количество calories
которых в столбце не превышает 1500.
Как я могу сделать это с помощью Laravel Eloquent?
Получить все рецепты для каждой категории еды (закуски, обед, ужин). Рассчитайте все возможные комбинации рецептов для каждой категории блюд. Фильтруйте комбинации, в которых общее количество калорий не превышает дневной лимит калорий. Выберите по одной комбинации из каждой категории питания, чтобы составить ежедневный план питания.
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);
Этот код создаст ежедневный план питания с рецептами из каждой категории приема пищи (закуски, обед, ужин), где общее количество калорий не превышает указанный дневной лимит калорий. Если для категории блюд нет допустимых комбинаций, он выбирает один рецепт с самым высоким содержанием калорий для этой категории.
Сначала вам следует указать пороговое значение ваших ежедневных калорий, а затем, когда запрос найдет случайный рецепт, вам следует уменьшить оставшиеся калории на количество калорий, содержащихся в этом рецепте. Сделайте это для каждой категории.
$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();
Очень интересный и простой метод! Некоторые ограничения, потому что мне придется разделить, и некоторые рецепты будут исключены. Спасибо, что поделились!
Цените ваш отзыв.
При этом не будут выбраны закуски с калорийностью более 500 калорий.
Действительно мило! Этот метод более продвинут и отлично работает. Я многому научился благодаря вашим функциям. Спасибо!