扩展Laravel 4连接类?

时间:2014-07-14 03:31:12

标签: php mysql laravel laravel-4

有没有办法扩展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有这个默认功能,因为所有的幕后工作确实让事情变得更容易实现。

感谢您的帮助。

1 个答案:

答案 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])

之类的内容