有没有办法扩展Laravel连接类?
基本上我需要insert()
命令的强大功能,但我需要在查询中添加更多单词。 Laravel没有ON DUPLICATE KEY
功能。所以我需要能够将我的数据数组传递给函数,并让它处理剩下的事情。
我尝试了一个原始查询,但我真的不知道如何使我的多维数据库数据与SQL一起工作,Laravel似乎就像魔法一样。
我希望有类似的东西:
DB::table('table')->insert($data);
在Laravel插入函数中,这是:
public function insert($tableName, array $data, array $types = array())
{
$this->connect();
if (empty($data)) {
return $this->executeUpdate('INSERT INTO ' . $tableName . ' ()' . ' VALUES ()');
}
return $this->executeUpdate(
'INSERT INTO ' . $tableName . ' (' . implode(', ', array_keys($data)) . ')' .
' VALUES (' . implode(', ', array_fill(0, count($data), '?')) . ')',
array_values($data),
is_int(key($types)) ? $types : $this->extractTypeValues($data, $types)
);
}
请改为:
public function insertIgnoreDuplicates($tableName, array $data, array $types = array(), $col)
{
$this->connect();
if (empty($data)) {
return $this->executeUpdate('INSERT INTO ' . $tableName . ' ()' . ' VALUES ()');
}
return $this->executeUpdate(
'INSERT INTO ' . $tableName . ' (' . implode(', ', array_keys($data)) . ')' .
' VALUES (' . implode(', ', array_fill(0, count($data), '?')) . ') ON DUPLICATE KEY SET $col=$col',
array_values($data),
is_int(key($types)) ? $types : $this->extractTypeValues($data, $types)
);
}
我看到了几个关于扩展课程的博客,但是他们说这样做的唯一方法就是重新实现每个功能,这在Laravel升级方面很糟糕。
除非有人有不同的选择:
DB::table('table')->insert($data);
并添加重复键约束,我很乐意听到。
我试过这个:
$columns = implode(", ", array_keys($data));
$escaped_values = array_map('mysql_real_escape_string', array_values($data));
$values = implode("', '", $escaped_values);
if (DB::statement("INSERT INTO `my_table` ($columns) VALUES ($values) ON DUPLICATE KEY UPDATE col_a = col_a")) {
return true;
} else {
return false;
}
我在另一篇SO帖子中找到了,但我一直得到“mysql_real_escape_string()期望参数1为字符串,给定数组”
所以任何帮助都表示赞赏。我真的希望Laravel有这个默认功能,因为所有的幕后工作确实让事情变得更容易实现。
感谢您的帮助。
答案 0 :(得分:0)
错误是由$data
数组的某个成员引起的; mysql_real_escape_string
需要一个字符串,array_map
正在为$data
的每个成员提供一个字符串,无论其类型如何。
在将值传递给DB::statement
之前,无需手动转义值。 Eloquent在幕后使用PDO,它将逃避绑定参数。尝试DB::statement('INSERT INTO
my_table (?, ?) VALUES (?, ?) ON DUPLICATE KEY UPDATE col_a = col_a', array('col_a', 'col_b', $data[0], $data[1])