webBG - програмисти, машинно обучение, javascript, python, php, питам, говорим, публикации

Laravel 5: разграничете дали нов ред е вмъкнат в DB

как мога да разгранича дали е вмъкнат нов ред или не използва Laravel DB::insert()?, моята заявка:

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

echo $return; // 1 in both cases

Открих и в двата случая, ако вмъкнатият нов ред връща 1 и ако не (поради дублиране на първичен ключ) връща 1 също.

04.01.2016

Отговори:


1

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

04.01.2016
  • Не искам да задействам изключение, искам да продължа процеса, независимо дали е вмъкнат нов ред или не. 04.01.2016
  • Това е най-лесният начин. Увийте try/catch само около този ред код и използвайте finally{} (PHP ›5.5), за да продължите процеса, ако е необходимо. 04.01.2016

  • 2

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

    Например:

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

    3

    Всъщност DB::insert() връща булево от PDOStatement::execute() и когато връща true, това означава, че изразът е бил "успешен", но не означава, че е променил нещо. Това просто означава, че няма грешка.

    предлагам да получите вмъкнат идентификатор и след това да тествате дали съществува или не:

    $return = DB::insert("
             INSERT IGNORE INTO groups
             (uid,name)
             VALUES
             ({$uid},'{$name}')
        ");
    
    $lastId = DB::getPdo()->lastInsertId();
    
    if($lastId!=0){
        // it exist ..
    }
    
    04.01.2016
  • класът 'Illuminate\Database\MySqlConnection' няма метод 'insertGetId' laravel.com/docs/ 5.1/queries#inserts 04.01.2016
  • Методът insertGetId е част от QueryBuilder laravel.com/api/ 5.2/Illuminate/Database/Query/ ще трябва да посочите масив от параметри, когато го използвате и той няма начин да посочи условието ИГНОРИРАНЕ. Имаше дискусия по въпроса, но отговорът беше просто да се използват необработени заявки github.com/laravel/ framework/issues/9612, което не помага в този случай. 04.01.2016
  • Да, сега виждам какъв е проблемът. все пак имам предложение, надявам се да помогне 04.01.2016
  • Като заобиколно решение можете по-добре да използвате int DB::affectingStatement(string $query, array $bindings = []) за всеки тип заявка. Той ще върне броя на редовете на засегнатите кортежи. Разчитането на lastInsertId() може да означава, че ако вмъкнете в различни таблици, идентификаторът просто ще остане същият. 30.07.2019

  • 4

    Или извличате lastInsertedId(), като проверявате сравнението, или можете също да използвате Laravel Observers там, така че ако нещо бъде вмъкнато в базата данни, наблюдателят ще бъде извикан автоматично от модела.

    04.01.2016
  • Само една бележка. Това е част от Eloquent, който например по подразбиране не е активиран в Laravel Lumen. Също така, ако логиката ви е разделена по този начин, разлага ума ви, тъй като случаят, в който редовете действително се вмъкват, вероятно е случаят по подразбиране. PHP няма вградена поддръжка за неща, които правят това по-лесно, като съвместни процедури. По-добре използвайте int DB::affectingStatement(string $query, array $bindings = []) 30.07.2019

  • 5

    Въз основа на отговора на @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.
    }
    
    04.01.2016

    6

    Можете по-добре да използвате int DB::affectingStatement(string $query, array $bindings = []) за всеки тип заявка. Той ще върне броя на редовете на засегнатите кортежи.

    Вече беше наличен в Laravel 4.x

    30.07.2019
    Нови материали

    Как да предотвратите влизането на някой от вашата кодова база
    // TLDR TypeScript добавя статично въвеждане към JavaScript, улавяйки грешки като препращане към променливи извън обхвата или извикване на функции с грешни аргументи. Той е несъвършен и има..

    Анализ на настроението с помощта на логистична регресия и наивен Бейс
    Нека сравним кой алгоритъм е по-добър за класифициране на туитовете въз основа на техните чувства. Наблюдаван ML При контролираното машинно обучение обикновено имате вход X, който влиза във..

    Нови тенденции в AI и спорта
    Изкуственият интелект е авангардна технология, която дава възможност на машините да изпълняват задачи, които обикновено изискват човешки интелект, като вземане на решения, разпознаване на реч и..

    Графични теоретични алгоритми
    Автори:- Yash Gaherwar , Tanishq Deshpande , Devanshu Dalal , Avinash Dhakne В тази статия ще обсъдим една от най-важните теми на „ Анализ на дизайна на алгоритми“ , т.е. Графика . Ще..

    Samsung и услугата Polyfill
    Като разработчик харесвам услугата polyfill. Използвайки го, поправих стари проблеми със съвместимостта на IE, като добавих един маркер за скрипт. Полифилът е скрипт, внедряващ функция от..

    Оцветяване на графика Sudoku с Neo4j
    Бях щастлив да видя, че скорошна версия на графичните алгоритми Neo4j съдържа алгоритъма за оцветяване K-1 . Този алгоритъм се опитва да присвои цветове на възлите на графика по такъв начин, че..

    Как преподавате физика на модели за машинно обучение?
    Хибридни анализи: Комбиниране на най-доброто от два свята В другите си публикации съм обхванал теми като: Машинно обучение за откриване на аномалии и мониторинг на състоянието , как..