首页 > 解决方案 > Laravel Eloquent updateOrCreate 函数不更新整行,而只更新一列

问题描述

我的 Laravel 应用程序有问题。我有一个 XML 文件,我需要将其逐行插入数据库并反复更新这些行。所以我决定使用 Eloquent 模型的“updateOrCreate”方法。但它的行为非常奇怪。我查看了文档,据我了解语法应该是这样的:

模型(在我的情况下是轮胎)::updateOrCreate (["用于搜索的搜索键"=> "键的值)"],["key1 => "valueofkey1", "key2=>"valueofkey2".. .]); 如果它没有找到任何带有“搜索键”的条目,那么它应该使用两个属性数组创建,但如果它确实找到了,它应该使用第二个参数数组进行更新。纠正我我错了。

这是一个完整的功能:

protected function updateDatabase()
    {
        set_time_limit(150000);//I know not the best approach - XML file has 30k+ rows so it takes a little time to complete
        $xml = @new SimpleXMLElement(Storage::disk('ftp')->get("Zaklad/PopisSortimentuVlastnostiXML.xml"));
        echo '<script>'; //debug message
        echo 'console.log("Xml optained")';
        echo '</script>';
        $kategorie = [
            'Dodávkové',
            'Osobní/Offroad/SUV',
            'Moto',
            'Osobní',
            'Hliníkové',
            'Ocelové',
            'Rezervní'
        ];
        $i = 0;
        echo '<script>';
        echo 'console.log("Started parsing");';//debug message
        echo 'console.log("Length is' . count($xml->table1->Detail_Collection->Detail) . '");';
        echo '</script>';
        foreach ($xml->table1->Detail_Collection->Detail as $detail) {
            echo '<script>';//debug message
            echo 'console.log("Row number:' . $i . '")';
            echo '</script>';
            $i++;
            if (in_array($detail['Sortiment3'], $kategorie)) {
                Tyre::updateOrCreate(
                    [
                        'IDItem' => $detail['IDItem']
                    ],
                    [
                        'Farba_nápisu' => $detail['Barva_nápisu'],
                        'Dosadacia_plocha' => $detail['Dosedací_plocha'],
                        'Druh_pneu' => $detail['Druh_pneu'],
                        'Duša'  => $detail['Druh_pneu'],
                        'EAN'  => $detail['EAN'],
                        'ET' => $detail['ET'],
                        'EU_Smernica' => $detail['EU_Smernica'],
                        'Hlucnost' => $detail['Hlucnost'],
                        'IDDisk_kompletu' => $detail['IDDisk_kompletu'],
                        'IDPneu_kompletu' => $detail['IDPneu_kompletu'],
                        'IndexT' => $detail['Index'],
                        'Index__kg_' => $detail['Index__kg_'],
                        'KodDodavatele' => $detail['KodDodavatele'],
                        'Konstrukce' => $detail['Konstrukce'],
                        'KonstrukceD' => $detail['KonstrukceD'],
                        'KonstrukceN' => $detail['KonstrukceN'],
                        'MatchT' => $detail['MatchT'],
                        'MaxCenaEur' => $detail['MaxCenaEur'],
                        'MaxCenaEurDPH' => $detail['MaxCenaEurDPH'],
                        'NapravaN' => $detail['NápravaN'],
                        'NazevZbozi' => $detail['NazevZbozi'],
                        'Objem' => $detail['Objem'],
                        'Obrazek' => $detail['Obrazek'],
                        'OchranaRafku' => $detail['OchranaRafku'],
                        'Platna' => $detail['Plátna'],
                        'Pocet_dier' => $detail['Počet_děr'],
                        'Pouzitie_agro' => $detail['Použití_agro'],
                        'Povrch_úprava' => $detail['Povrch_Úprava'],
                        'PoziceM' => $detail['PoziceM'],
                        'PrilnavostNaMokru' => $detail['PrilnavostNaMokru'],
                        'Profil' => $detail['Profil'],
                        'Provoz_Moto' => $detail['Provoz_Moto'],
                        'ProvozN' => $detail['ProvozN'],
                        'PSezona' => $detail['PSezona'],
                        'PSortiment' => $detail['PSortiment'],
                        'RafekD' => $detail['RáfekD'],
                        'RafekP' => $detail['RáfekP'],
                        'Roztec' => $detail['Rozteč'],
                        'Sezona' => $detail['Sezona'],
                        'Sortiment1' => $detail['Sortiment1'],
                        'Sortiment2' => $detail['Sortiment2'],
                        'Sortiment3' => $detail['Sortiment3'],
                        'Specifikace' => $detail['Specifikace'],
                        'SpotrebaPaliva' => $detail['SpotrebaPaliva'],
                        'Strana' => $detail['Strana'],
                        'Stredova_diera' => $detail['Středová_díra'],
                        'Sirka' => $detail['Šířka'],
                        'SirkaD' => $detail['ŠířkaD'],
                        'Technologie' => $detail['Technologie'],
                        'TridaVozu' => $detail['TridaVozu'],
                        'TypP' => $detail['TypP'],
                        'Urcenie' => $detail['Určení'],
                        'Ventil' => $detail['Ventil'],
                        'Vyrobce1' => $detail['Vyrobce1'],
                        'Vyrobce2' => $detail['Vyrobce2'],
                        'Vyrobce3' => $detail['Vyrobce3'],
                        'WebPopisSK' => $detail['WebPopisSK'],
                        'Zesileni' => $detail['Zesílení'],
                        'ZnackaAuta' => $detail['ZnackaAuta'],
                    ]
                );
            }
        }
        echo "DONE";
        set_time_limit(120);
    }

我不知道我在哪里犯了错误,但是如果我有一个空的数据库表,一切都会正常运行,但是当我想更新数据库时,只有“IDItem”列被更新为正确的值,所有剩余的列都得到更新为整个表中每列的相同值。我检查了 XML 文件中的值,并且所有内容都是正确的。我无法解释为什么会这样。先感谢您。

标签: phpdatabaselaraveleloquent

解决方案


推荐阅读