2017-03-08 3 views
0

私はlaravelを初めて使用しています。これはあまり考えられないことを事前に警告しています。Eloquentを使用したCSVファイルからモデルをシードする

私はいくつかのモデルにCSVファイルをシードしようとしています。このファイルは店舗の名前と場所のリストを保持しています。のは、それは次のようになりましょう:終わり

StoreName, City, State 
store1, Philadelphia, PA 
store2, Philadelphia, PA 
store3, Altoona, PA 
store4, Portland, OR 
store5, Portland, OR 

、結果は市のモデルと状態モデルになります。

id, name, total 
1, PA, 3 
2, OR, 2 
:その状態で

id, name, state, total 
1, Philadelphia, PA, 2 
2, Altoona, PA, 1 
3, Portland, OR, 2 

と国家モデル名の列を持つことになりますし、総店舗:市は、市、州の名前の列、および総店舗その都市のを持っているでしょう

私はその後、状態モデル内のhasManyの関係を有する:

class State extends Model 
{ 
    public function cities() 
    { 
     return $this->hasMany(City::class, 'state', 'name'); 
    } 
} 

この関係は、LOCとして市から外部キーとして国家モデルからの「状態」欄、および「名前」欄を定義しますアル鍵。

この関係が改善できるかどうかは疑問です。 'state_id'の属性を持つCity Modelを作成し、State Modelの 'id'属性に一致させる方法がありますか?私がApp\State::find(#)->citiesと呼んだとき、これはパフォーマンスの向上のためになりますか?

または、「状態」を状態モデルの外部キーとして定義するために何か必要なことはありますか?

また、CSVの各レコードをforeachループで処理するのではなく、Eloquentを使用して複数の別々のモデルにCSVファイルを抽出する簡単な方法がありますか?

おかげで、これはlaravelに関連していないで、事実

答えて

0

は、この質問はlaravelよりも多くのデータベース設計に関連しています。

「state_id」という属性を持つCityモデルを作成し、State Modelの「id」属性に一致させる方法はありますか?

はい、整数または状態IDを使用できます。比較する数値が文字列ベースの比較よりも高速であるため、より好ましいです。

また、CSVの各レコードのforeachループではなく、Eloquentを使用して複数の別々のモデルにCSVファイルを抽出する簡単な方法がありますか?

私はあなたがそれを一つの方法または別のを行う必要があり、そうは思いませんが、あなたはそれを読みやすくするために、アレイの機能を使用することができますし、少し短い。..

などの状態を抽出しますCSVから

$csv = array_map('str_getcsv', file('data.csv')); 

$states = array_unique(array_column($csv,2)); 
$cities = array_unique(array_column($csv,1)); 
関連する問題