2016-11-28 91 views
0

我有2個模型,我想通過CVS導入填充。第一個模型是零售店列表,第二個模型是零售店對應的位置。CSV導入時的引用關係ID

這是CSV導入:

name,email,website,street_number,street_address,city,country,postcode,latitude,longitude 
"Example name",[email protected],10,"random street",amsterdam,netherlands,4000,52.666,4.3333 

RetailStores.php模型將需要這些值:

name, 
email, 
website 

LocationStores.php模型將需要這些值:

street_number, 
street_address, 
city, 
country, 
postcode, 
latitude, 
longitude 

我將解壓來自CSV文件的數據在之內循環並將它們附加到一個空數組變量,從這裏將使用一些Eloquent來填充數據庫。下面是我如何做到這一點:

$file = Input::file('csv_file'); 
$data = $this->retailer->processCsv($file); 

$retailers = []; 
$locations = []; 


foreach ($data as $value) { 

    $retailers[] = array(
     'user_id' => Auth::user()->id, 
     'name' => $value['name'], 
     'email' => $value['email'], 
     'website' => $value['website'], 
     'created_at' => Carbon::now(), 
     'updated_at' => Carbon::now() 
    ); 

    $locations[] = array(
     'retailer_id' => $value['retailer_id'], // ISSUE HERE 
     'street_number' => $value['street_number'], 
     'street_address' => $value['street_address'], 
     'city' => $value['city'], 
     'state' => $value['state'], 
     'country' => $value['country'], 
     'country_code' => $value['country_code'], 
     'postcode' => $value['postcode'], 
     'latitude' => $value['latitude'], 
     'longitude' => $value['longitude'], 
     'created_at' => Carbon::now(), 
     'updated_at' => Carbon::now() 
    ); 

    Retailer::insert($retailers); 
    Location::insert($locations); 
} 

正如上面提到我有2個獨立的車型零售商位置。我需要參考$locations陣列中的零售商ID。現在我有一個選項,讓用戶輸入CSV文件中每個位置的相關零售商商店標識,但人們都很好......你知道的。

但是考慮到CSV文件將提供一個「商店名稱」它具有每一個位置,有沒有引用一個增量ID在陣列中的每個獨特的商店名稱的方法嗎?例如,如果CSV表有這些值:

Fruit,[email protected],www.fruit.com,1,"apple street",etc 
Fruit,[email protected],www.fruit.com,120,"pear parkway",etc 
Fruit,[email protected],www.fruit.com,350,"orange avenue",etc 
Meat,[email protected],www.meat.com,33,"Steak street",etc 
Meat,[email protected],www.meat.com,33,"Chicken Road",etc 

的foreach循環中得到這些值,有沒有辦法可以用下面的增量ID爲每個因此這將引用的重複商店名稱相關商店到它的位置?

任何意見,非常感謝。

回答

0

您可以通過易於檢查零售商數組中是否存在特定名稱的方式來存儲零售商名稱,如果是,則將該ID取出。事情是這樣的:

foreach ($data as $value) { 

    $retailer_name = $value['name']; // for clarity 

    // is the retailer name in the retailers array already? 
    if (isset($retailers[$retailer_name])){ 
     // get the ID 
     $retailer_id = $retailers[$retailer_name]['user_id']; 
    } else { // otherwise add a new one 
     $retailer_id = Auth::user()->id; //store the ID for use in Locations 

     // use retailer name for the key of the array, so it's easily findable later 
     $retailers[$retailer_name] = array(
      'user_id' => $retailer_id, 
      'name' => $value['name'], 
      'email' => $value['email'], 
      'website' => $value['website'], 
      'created_at' => Carbon::now(), 
      'updated_at' => Carbon::now() 
     ); 
    } 


     $locations[] = array(
      'retailer_id' => $retailer_id, // add either the new or existing ID 
      'street_number' => $value['street_number'], 
      'street_address' => $value['street_address'], 
      'city' => $value['city'], 
      'state' => $value['state'], 
      'country' => $value['country'], 
      'country_code' => $value['country_code'], 
      'postcode' => $value['postcode'], 
      'latitude' => $value['latitude'], 
      'longitude' => $value['longitude'], 
      'created_at' => Carbon::now(), 
      'updated_at' => Carbon::now() 
     ); 

     Retailer::insert($retailers); 
     Location::insert($locations); 
} 

你就必須使用字符串作爲$retailers數組中的鍵,不過,如果這是插入一個問題,你必須做一個單獨的數組零售商或將其更改爲數字鍵在插入之前。