2016-01-04 3 views
2

как я могу отличить, если новая строка вставлена ​​или не использовать Laravel DB::insert(), мой запрос:Laravel 5: дифференцироваться, если новая строка вставляется в БД

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

echo $return; // 1 in both cases 

я нашел в обоих случаях, если новая строка вставляется возвращается 1 и если нет (из-за дублирования первичного ключа) возвращает 1.

ответ

0

Используйте оператор строгого сравнения различать булеву 1 из буквального 1.

Например:

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

На самом деле DB::insert() возвращает логическое значение из PDOStatement::execute(), и когда возвращает истину это означает, что заявление было «успешным , «но это не значит, что оно что-то изменило. Это просто означает, что ошибки не было.

я предлагаю, чтобы вставить идентификатор, а затем проверить, если он существует, или нет:

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

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

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

класс «Осветите \ Database \ MySqlConnection» не имеет метод «insertGetId» HTTPS : //laravel.com/docs/5.1/queries#inserts – mwafi

+0

Метод insertGetId является частью QueryBuilder https://laravel.com/api/5.2/Illuminate/Database/Query/Builder.html#method_insertGetId, d должен указывать массив параметров при его использовании, и он не имеет никакого способа указать условие IGNORE. Там было некоторое обсуждение, но ответ заключался в том, чтобы просто использовать необработанные запросы https://github.com/laravel/framework/issues/9612, которые в этом случае не помогают. –

+0

Да, теперь я вижу, в чем проблема. У меня есть предложение, хотя я надеюсь, что он может помочь –

1

Не используйте INSERT IGNORE, просто использовать регулярное заявление INSERT или модель вставку, и завернуть его в виде исключения обработчик. Если исключение запускается, вставка не создает новую строку.

+0

Я не хочу, чтобы исключить исключение, я хочу продолжить процесс, независимо от того, вставлена ​​ли новая строка или нет. – mwafi

+0

Это самый простой способ. Оберните 'try/catch' только в этой строке кода и используйте' finally {} '(PHP> 5.5), чтобы продолжить процесс, если это необходимо. – Moe

0

Либо вы извлекаете lastInsertedId(), проверяя сравнение или вы можете также использовать Laravel наблюдателей там, так что если любая вещь будет вставляется в базу данных, наблюдатель будет автоматически вызываться из модели.

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. 
} 
Смежные вопросы