Есть ли способ, которым я мог бы минимизировать отключение базы данных Mysql для этого куска кода? - PullRequest
2 голосов
/ 04 июня 2011

У меня есть таблица с именем 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();    
        }
    }
}

приведенный выше код будет запускать цикл и будет часто посещать базу данных для вставки записей. Могу ли я в любом случае сократить поездку и свести ее к минимуму?

Ответы [ 2 ]

2 голосов
/ 04 июня 2011

Вы можете сделать вставку с несколькими значениями (для 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)
0 голосов
/ 04 июня 2011

Не ответ "один к одному", а вот как сделать его более эффективным:

Move

 $sth = $this->dbh->prepare('INSERT INTO
                                        propAmenities
                                        (amenity_id, property_id)
                                        VALUES
                                        (:amenityId, :propertyId)');
$sth->bindParam(':propertyId', $this->data['propertyId']);

из цикла for. Нет необходимости вызывать его несколько раз. Это должно уменьшить трафик.

EDIT

поэтому ваш код становится

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();    
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...