#php #mysql #database #pdo
#php #mysql #База данных #pdo
Вопрос:
у меня есть таблица с именем, propAmenities
которая содержит два столбца, amenity_id
и property_id
в основном таблица содержит внешние ключи.
теперь у меня есть две вставки данных в эту таблицу, и при вставке данных property_id
столбец будет иметь одинаковое значение для всех строк, которые должны быть вставлены, в то время как amentiy_id
значение будет отличаться, теперь, например, значения могут выглядеть как
INSERT INTO propAmenities(amenity_id, property_id) VALUES(1,1);
INSERT INTO propAmenities(amenity_id, property_id) VALUES(2,1);
INSERT INTO propAmenities(amenity_id, property_id) VALUES(3,1);
INSERT INTO propAmenities(amenity_id, property_id) VALUES(4,1);
INSERT INTO propAmenities(amenity_id, property_id) VALUES(5,1);
и текущий код для вставки данных, которые я использую, является:
public function savePropAmenities($amenityIds = array()) {
if($this->validateRequired(array('propertyId'))) {
foreach($amenityIds as $amenityId) {
$sth = $this->dbh->prepare('INSERT INTO
propAmenities
(amenity_id, property_id)
VALUES
(:amenityId, :propertyId)');
$sth->bindParam(':amenityId', $amenityId);
$sth->bindParam(':propertyId', $this->data['propertyId']);
$sth->execute();
}
}
}
приведенный выше код запустит цикл и будет часто обращаться к базе данных для вставки записей. могу ли я в любом случае сократить отключение и свести его к единице?
Комментарии:
1. Почему у вас есть возврат в цикле for? Это заставляет приведенный выше код выполняться только один раз!
2. правильно указано, я забыл об этом, спасибо…
Ответ №1:
Вы можете выполнить вставку нескольких значений (по крайней мере, для MySQL)
INSERT INTO propAmenities (amenity_id, property_id) VALUES (1, 1), (2, 1), (3, 1)
Также вы можете установить значение по умолчанию для поля в базе данных.
ALTER propAmenities MODIFY COLUMN property_id INT DEFAULT 1;
Тогда вы могли бы сделать это
INSERT INTO propAmenities (amenity_id) VALUES (1), (2), (3)
Комментарии:
1. первое ваше утверждение — это то, что я искал, интересно, как я его пропустил 🙂
2. Я нашел это, проверив файл mysqldump в какой-то момент, я никогда не замечал этого сам до тех пор 🙂
Ответ №2:
Не сводимый к одному ответ, но вот как сделать его более эффективным:
Переместить
$sth = $this->dbh->prepare('INSERT INTO
propAmenities
(amenity_id, property_id)
VALUES
(:amenityId, :propertyId)');
$sth->bindParam(':propertyId', $this->data['propertyId']);
выход из цикла for. Нет необходимости вызывать это несколько раз. Это должно уменьшить некоторый трафик.
Редактировать
таким образом, ваш код становится
public function savePropAmenities($amenityIds = array()) {
if($this->validateRequired(array('propertyId'))) {
$sth = $this->dbh->prepare('INSERT INTO
propAmenities
(amenity_id, property_id)
VALUES
(:amenityId, :propertyId)');
$sth->bindParam(':propertyId', $this->data['propertyId']);
foreach($amenityIds as $amenityId) {
$sth->bindParam(':amenityId', $amenityId);
$sth->execute();
}
}
}
Комментарии:
1. я не могу понять, что именно вы пытаетесь сказать, как получилось, что я смогу вставить amenity_id в ваш фрагмент кода, и это тоже без цикла?
2. не удаляйте цикл for, переместите их из цикла for. смотрите редактирование