есть ли какой-либо способ, которым я мог бы минимизировать отключение базы данных Mysql для этого фрагмента кода?

#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. смотрите редактирование