2016-11-28 18 views
0

私はCVSインポートによって2つのモデルを作成したいと思います。第1のモデルは小売店のリストであり、第2のモデルは小売店の対応する場所である。参照CSVインポートのリレーションシップID

これは、CSVのインポートです:

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

私が抽出されます:LocationStores.phpモデルは、これらの値が必要になります

name, 
email, 
website 

RetailStores.phpモデルは、これらの値が必要になります

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 

内の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ファイルの各場所に関連する小売店の店舗IDをユーザーに入力させるオプションを持っていますが、人々はよく知っています。

ただし、CSVファイルは、それが持っている場所ごとに「店舗名」を供給することを考慮すると、アレイ内の各ユニークな店舗名の増分IDを参照する方法はありませんか?

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ループ内でこれらの値を取得し、1は、このように参照します繰り返さストア名ごとにインクリメントIDを与えることができる方法はあります。たとえばCSVテーブルには、これらの値を持っていた場合関連する店舗をその場所に移動しますか?

アドバイスありがとうございました。

答えて

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のためのキーとして文字列の配列を持っている、そしてそれが挿入するための問題だ場合、あなたが小売業者のために別々の配列を作るか、数字キーにそれを変更する必要があります挿入する前に

関連する問題