2015-11-23 47 views
0

因此,我從CRM填充我的數據庫,並且試圖將每個項目提供的ID用作我的主鍵(我覺得這樣會使事情變得更加複雜,但如果這是不好的做法,請讓我知道)。問題是,當表已經有一些數據,我重新運行該功能,我得到這個錯誤:將自定義ID分配給Laravel模型時重複條目

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '25930688' for key 'PRIMARY' 

糾正我,如果我錯了,但我會一直期待雄辯檢查前行存在試圖插入它。我試過保存,創建,firstOrNew,firstOrCreate。他們都返回相同的錯誤。我已經搜索了很多,但我很新,所以我不確定我在尋找合適的術語。

$listing = Property::create([ 
     'id' => $property['@attributes']['id'], 
     'house_flat_number' => $property['address']['name'], 
     'street_address_1' => $property['address']['street'], 
     'street_address_2' => $property['address']['town'], 
     'postcode' => $property['address']['postcode'] 
+0

我不認爲如果在插入之前就存在ID Laravel會檢查,你需要做手工。 – vonec

+0

我會運行一個簡單的選擇查詢,無論你用什麼軟件來管理你的數據庫在你的財產表上 - 'select * from property where id = 25930688'並查看是否已經有記錄,如果是,那是你的問題。你確定你從CRM獲得的ID是獨一無二的嗎?如果這樣做你有這種做法之前的現有數據? – Joshua

+0

@Joshua - 我想這可能是一個解決方案。沒有現有的數據,並且CRM ID是唯一的。問題是我想重新運行該功能只添加新的屬性,並且每次它將所有屬性添加到數據庫,所以它會從50到100到150 findOrNew +填充由jarek工作建議 – eurobob

回答

3

使用findOrNew + fill而不是create,你是好:

$listing = Property::findOrNew($property['@attributes']['id']) 
    ->fill([ 
    'id' => $property['@attributes']['id'], 
    'house_flat_number' => $property['address']['name'], 
    // ... 
    ])->save(); 
+0

太棒了,非常感謝。我知道必須有一個能夠處理這個問題的功能。看起來非常蹩腳,不這樣做! – eurobob