我是laravel的新手,所以提前警告这可能是一个明智的选择。
我正在尝试使用CSV文件播放几个模型。该文件包含商店的名称和位置列表。让我们说它看起来像这样:
StoreName, City, State
store1, Philadelphia, PA
store2, Philadelphia, PA
store3, Altoona, PA
store4, Portland, OR
store5, Portland, OR
最后,结果将是城市模型和州模型。 City将列出该城市,州和商店名称的列:
id, name, state, total
1, Philadelphia, PA, 2
2, Altoona, PA, 1
3, Portland, OR, 2
状态模型将包含名称列和该州的总商店:
id, name, total
1, PA, 3
2, OR, 2
然后我在State Model中有一个hasMany关系:
class State extends Model
{
public function cities()
{
return $this->hasMany(City::class, 'state', 'name');
}
}
此关系将State Model中的'state'列定义为外键,将City中的'name'列定义为本地键。
我想知道这种关系是否会更好。有没有办法可以使用'state_id'属性构建City Model,然后匹配State Model的'id'属性?当我拨打App\State::find(#)->cities
时,这是否会提高性能?
或者,我还需要做些什么来将'state'定义为State Model的外键吗?
此外,是否有一种更简单的方法可以使用Eloquent将CSV文件提取到多个单独的模型,而不是通过CSV中的每个记录进行foreach循环?
谢谢,
答案 0 :(得分:0)
实际上这与laravel无关,这个问题与laravel相关的数据库设计有关。
有没有办法可以使用' state_id'来构建城市模型,然后匹配状态模型' id'属性?
是的,你可以使用整数或状态id,因为比较数字比基于字符串的比较要快,所以它更可取。
此外,是否有一种更简单的方法可以使用Eloquent将CSV文件提取到多个单独的模型,而不是通过CSV中的每个记录进行foreach循环?
我不这么认为,你必须以这种或那种方式去做,但是你可以使用数组函数使它更容易阅读和更短......
例如从csv中提取状态
$csv = array_map('str_getcsv', file('data.csv'));
$states = array_unique(array_column($csv,2));
$cities = array_unique(array_column($csv,1));