Я не уверен, как правильно назвать вопрос, и поскольку у меня не было лучшего заголовка, мне не удалось найти много вопросов по той же проблеме, о которой можно было бы спросить раньше.
В моей базе данных есть отношение "один-много", данные распространяются по нескольким таблицам.
public function get_recipe_data($id){
$sth = $this->db->prepare('SELECT * FROM
recipe as recipe
LEFT JOIN recipe_introduction as introduction
ON recipe.id = introduction.recipe_id
LEFT JOIN recipe_ingredients as ingredients
ON recipe.id = ingredients.recipe_id
LEFT JOIN recipe_ingredients_notes as notes
ON recipe.id = notes.recipe_id
LEFT JOIN recipe_macros as macros
ON recipe.id = macros.recipe_id
WHERE recipe.id = :id
');
$sth->bindValue(':id', $id, PDO::PARAM_INT);
$sth->execute();
return $sth->fetch(PDO::FETCH_ASSOC);
}
public function convertCategoryId($category_id){
$sth = $this->db->prepare('SELECT name FROM recipe_categories WHERE id = :category_id');
$sth->bindValue(':category_id', $category_id, PDO::PARAM_INT);
$sth->execute();
return $sth->fetch(PDO::FETCH_ASSOC);
}
В таблице рецептов есть столбец, который имеет идентификатор для названия категории и относится к другой таблице.
таблица рецептов
+----+-------+-------------+
| id | title | category_id |
+--------------------------+
| 1 | ... | 1 |
+----+-------+-------------+
| 2 | ... | 3 |
+----+-------+-------------+
У меня есть эта другая таблица
recipe_categories
+----+------------+
| id | name |
+----+------------+
| 1 | breakfast |
+----+------------+
| 2 | lunch |
+----+------------+
| 3 | dinner |
+----+------------+
| .. | ... |
+----+------------+
Прямо сейчас мне нужно вернуть результаты из первого запроса выше, а затем, как только я это сделаю, я запустил другой метод в классе, передав category_id из первого запроса, а затем сопоставил его с recipe_categories, но это настолько неэффективно,
Есть ли способ, чтобы я мог выбрать имя прямо из первого запроса?
Просто присоединитесь к таблице категорий в таблице рецептов, это даст вам доступ к имени категории в одном запросе.
SELECT
*
FROM recipe AS recipe
INNER JOIN recipe_categories AS rcat ON recipe.category_id = rcat.id
LEFT JOIN recipe_introduction AS introduction ON recipe.id = introduction.recipe_id
LEFT JOIN recipe_ingredients AS ingredients ON recipe.id = ingredients.recipe_id
LEFT JOIN recipe_ingredients_notes AS notes ON recipe.id = notes.recipe_id
LEFT JOIN recipe_macros AS macros ON recipe.id = macros.recipe_id
WHERE recipe.id = id
Заметка. Несмотря на то, что среди пользователей PHP распространена практика использования "select *", наилучшей практикой является то, что вы должны указать каждый столбец, который вы хотите вернуть, и не оставлять его на волю случая.