Ben CSV dosyalarını ithal eden bir komut dosyası var. Ne benim veritabanında biter, diğer şeyler arasında, bir müşteri listesi ve adresleri listesidir. I customer
adında bir tablo var ve address
bir customer_id
sahip olduğu address
adında başka.
Benim için önemli olan tek şey, herhangi bir yinelenen satırları sahip değildir. Bu nedenle, ben bir adres almak her zaman, ben böyle bir şey yapmak:
$address = new Address();
$address->setLine_1($line_1);
$address->setZip($zip);
$address->setCountry($usa);
$address->setCity($city);
$address->setState($state);
$address = Doctrine::getTable('Address')->findOrCreate($address);
$address->save();
findOrCreate()
, muhtemelen tahmin edebileceğiniz gibi, eğer varsa, aksi takdirde sadece yeni bir Address
nesneyi döndürmek, eşleşen bir adres kaydı bulmak nedir gelmez. İşte kod:
public function findOrCreate($address)
{
$q = Doctrine_Query::create()
->select('a.*')
->from('Address a')
->where('a.line_1 = ?', $address->getLine_1())
->andWhere('a.line_2 = ?', $address->getLine_2())
->andWhere('a.country_id = ?', $address->getCountryId())
->andWhere('a.city = ?', $address->getCity())
->andWhere('a.state_id = ?', $address->getStateId())
->andWhere('a.zip = ?', $address->getZip());
$existing_address = $q->fetchOne();
if ($existing_address)
{
return $existing_address;
}
else
{
return $address;
}
}
Bunu yaparken ile sorun yavaş olmasıdır. (Farklı masalarda birkaç INSERT
tabloların içine çevirir) CSV dosyasındaki her satırı kaydetmek için, ikinci hakkında bir çeyrek alır. Ben bazen benim CSV dosyasında 50.000 'den fazla satır var çünkü olarak yakın "anlık" mümkün olduğunca onu almak istiyorum. Ben adreslerini kaydeder benim ithalat bölümünü yorum varsa, çok daha hızlı olduğunu gördük. Ben bu yapabileceği bazı hızlı bir yolu var mı? Ben kısaca bunun üzerinde bir dizin koyarak kabul ama tüm alanları eşleşmesi gerekir, çünkü bir dizin yardımcı olmaz gibi görünüyor.