Men*_*s93 6 php csv doctrine-orm symfony-2.8
我创建了一个脚本,用于从CSV文件中读取数据,检查数据中是否已存在数据,如果不存在则导入数据.如果数据确实存在(特定产品的代码),则需要从CSV文件更新其余信息.
例如; 我的代码为WTW-2LT,在我的CSV文件中名为Alex和姓Johnson.该脚本检查代码为WTW-2LT且名为Alex和姓氏Johnson的成员是否已存在,如果有,则需要从脚本更新联系人详细信息和额外详细信息(还需要检查主题和讲师等其他详细信息,所有细节都在CSV中的一行中,如果它不存在,则只需要创建新成员.
我的脚本到目前为止我用最少的其他检查来防止分心现在;
while ($row = fgetcsv($fp, null, ";")) {
if ($header === null) {
$header = $row;
continue;
}
$record = array_combine($header, $row);
$member = $this->em->getRepository(Member::class)->findOneBy([
'code' =>$record['member_code'],
'name' =>$record['name'],
'surname' =>$record['surname'],
]);
if (!$member) {
$member = new Member();
$member->setCode($record['member_code']);
$member->setName($record['name']);
$member->setName($record['surname']);
}
$member->setContactNumber($record['phone']);
$member->setAddress($record['address']);
$member->setEmail($record['email']);
$subject = $this->em->getRepository(Subject::class)->findOneBy([
'subject_code' => $record['subj_code']
]);
if (!$subject) {
$subject = new Subject();
$subject->setCode($record['subj_code']);
}
$subject->setTitle($record['subj_title']);
$subject->setDescription($record['subj_desc']);
$subject->setLocation($record['subj_loc']);
$lecturer = $this->em->getRepository(Lecturer::class)->findOneBy([
'subject' => $subject,
'name' => $record['lec_name'],
'code' => $record['lec_code'],
]);
if (!$lecturer) {
$lecturer = new Lecturer();
$lecturer->setSubject($subject);
$lecturer->setName($record['lec_name']);
$lecturer->setCode($record['lec_code']);
}
$lecturer->setEmail($record['lec_email']);
$lecturer->setContactNumber($record['lec_phone']);
$member->setLecturer($lecturer);
$validationErrors = $this->validator->validate($member);
if (!count($validationErrors)) {
$this->em->persist($member);
$this->em->flush();
} else {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
您可以注意到此脚本必须查询数据库3次以检查是否存在一个CSV行.在我的情况下,我有多达2000多行的文件,因此每行执行3次查询以检查该行是否存在非常耗时.
不幸的是,我也无法批量导入行,因为如果一个主题不存在,它将创建它很多次,直到批次被刷新到数据库,然后我坐在那里没有任何意义的重复记录.
如何才能最大限度地提高性能和速度?就像首先从数据库中获取所有记录并将其存储在数组中(内存消耗?)然后进行检查并将该行添加到数组中并从那里检查...
有人可以帮我找到改善这个的方法(请提供示例代码吗?)
说实话,我确实找到了2000多行,其中3x的查询数量并不多.但是,既然你要求表现,这是我的两分钱:
使用框架总是会产生开销.这意味着如果您在本机PHP中创建此代码,它将更快地运行.我不熟悉symfony,但我假设你将数据存储在数据库中.在MySQL中,您可以使用该命令INSERT ... ON DUPLICATE KEY update.如果已将3个字段(代码,名称,姓氏)设置为主键(我假设),则可以使用它来:插入数据,但如果密钥已存在,则更新数据库中的值.MySQL将为你做checsk,看看数据是否已经改变:如果没有,将不会发生diskwrite.
我非常肯定您可以将本机SQL写入symfony,允许您使用框架提供的安全性,同时加快插入速度.
| 归档时间: |
|
| 查看次数: |
813 次 |
| 最近记录: |