Laravel 5:区分是否在DB中插入了新行

时间:2016-01-04 09:22:44

标签: php mysql laravel laravel-5

如何使用Laravel DB::insert()来区分是否插入新行?,我的查询:

$return = DB::insert("
     INSERT IGNORE INTO groups
     (uid,name)
     VALUES
     ({$uid},'{$name}')
");

echo $return; // 1 in both cases

我发现在两种情况下,如果插入的新行返回1,如果没有(因为重复主键),也会返回1

6 个答案:

答案 0 :(得分:1)

不要使用INSERT IGNORE,只需使用常规INSERT语句或模型插入,并将其包装在异常处理程序中。如果异常触发,则插入不会创建新行。

答案 1 :(得分:0)

使用严格比较运算符来区分布尔值1和文字1。

例如:

if ($insert === true) {
// this will only run if the insert is successful
}

答案 2 :(得分:0)

实际上DB::insert()会从PDOStatement::execute()返回一个布尔值, 当返回true时,表示该语句成功,"但这并不代表它改变了什么。这只是意味着没有错误。

我建议插入id,然后测试它是否存在:

$return = DB::insert("
         INSERT IGNORE INTO groups
         (uid,name)
         VALUES
         ({$uid},'{$name}')
    ");

$lastId = DB::getPdo()->lastInsertId();

if($lastId!=0){
    // it exist ..
}

答案 3 :(得分:0)

通过检查比较来检索lastInsertedId(),或者也可以在那里使用 Laravel Observers ,这样如果有任何东西插入到数据库中,将从模型中自动调用观察者

答案 4 :(得分:0)

在@ delatbabel的答案基础上,如果您正在创建程序性的代码,您可以使用以下内容:

$insertOK = false;
try{
         DB::insert("
         INSERT groups
         (uid,name)
         VALUES
         ({$uid},'{$name}')");

    $insertOK = true;

    }
    catch(Exception $e)
    {
    //Damn something went wrong.. handle this problem
    }


if($insertOK)
{
//Do some more things if you know the insert is OK.
}

答案 5 :(得分:0)

对于每种查询类型,您最好使用int DB::affectingStatement(string $query, array $bindings = [])。它将返回受影响的元组的行计数。

在Laravel 4.x中已经可用