如何使用Laravel DB::insert()
来区分是否插入新行?,我的查询:
$return = DB::insert("
INSERT IGNORE INTO groups
(uid,name)
VALUES
({$uid},'{$name}')
");
echo $return; // 1 in both cases
我发现在两种情况下,如果插入的新行返回1
,如果没有(因为重复主键),也会返回1
。
答案 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中已经可用