gidiyorum/geonames

一组模型和命令,以获取GeoNames在Eloquent ORM中的全部功能。

dev-master 2020-04-21 22:04 UTC

This package is auto-updated.

Last update: 2024-09-22 07:46:45 UTC


README

Build Status Coverage Status

一组Eloquent模型和命令,以获取Laravel中的GeoNames的全部功能。

安装

ipalaus/geonames添加到composer.json的需求中

{
    "require": {
        "ipalaus/geonames": "3.0.*"
    }
}

注意:如果您使用的是Laravel 5.1,可以使用版本"ipalaus/geonames": "2.0.*"

使用composer updatecomposer install更新您的包。

安装依赖项后,您需要在Laravel中注册geonames。打开您的app/config/app.php并将以下提供者添加到providers数组中

'Ipalaus\Geonames\GeonamesServiceProvider'

现在运行php artisan,您应该看到一个名为geonames的新命名空间,其中包含一些与包相关的命令。为了继续安装,请运行以下命令

$ php artisan vendor:publish --provider="Ipalaus\Geonames\GeonamesServiceProvider"

这将发布配置文件到config/geonames.php并将迁移到您的database/migrations目录。为了能够控制正在发生的事情,我们建议您手动触发php artisan migrate

Artisan命令

导入

导入命令下载所需的文件(在配置文件中可配置)并为每个文件运行一个seeder。提供了一些选项

  • --country=XX:下载特定国家(例如,US,ES,FR...)
  • --development:下载一个较小的名称文件(约10MB),对于开发环境非常有用。
  • --fetch-only:仅获取文件但不运行seeder。如果您想要下载文件并在离线时重新生成表,则可以使用此选项。
  • --wipe-files:强制删除旧文件。
$ php artisan geonames:import [--country="..."] [--development] [--fetch-only] [--wipe-files]

导入生产数据库可能需要一段时间。主文件约为1GB,seeder必须插入约600万行数据,同时为一些字段创建索引。在开发环境中,强烈建议使用--development选项并将完整导入保留到生产环境中。最终表的大小也可能影响您的本地MySQL实例。

安装

发布包的配置并运行所需的迁移。您可以使用--force选项强制发布配置。

$ php artisan geonames:install [-f|--force]

播种

该命令由geonames:import命令调用。它扩展了Laravel的db:seed,并添加了额外的选项:pathcountry。这是由于要导入的文件的大小以及我们必须运行的查询,geonames:import为每个seeder创建了一个新的Symfony\Component\Process\Process

您通常不需要直接调用此命令。

截断

您想要截断表并从头开始吗?运行

$ php artisan geonames:truncate

Eloquent模型

大陆

  • 关系
  • hasMany countries

国家

  • 关系
  • belongsTo continent
  • hasMany names

名称

  • 关系
  • belongsTo country,每个请求都会预加载

... 更多即将推出!

集成到当前Eloquent模型

ipalaus/geonames与现有Eloquent模型集成就像这样简单

<?php

class User extends Eloquent {

	public function geoname()
	{
		return $this->belongsTo('Ipalaus\Geonames\Eloquent\Name');
	}

}

现在您可以在User模型中添加一个geoname_id,并通过简单的以下代码获取结果

$user = User::with('geoname')->find(1);
echo $user->geoname->name;

Name模型中belongsTocountry关系始终会预加载。这意味着您可以使用与上面相同的代码获取国家名称。您只需要echo

echo $user->geoname->country->name;

您可以更进一步,并预加载geoname.country.continent关系(或Geoname模型中存在的任何现有关系)

$user = User::with('geoname.country.continent')->find(1);
echo $user->geoname->country->continent->name;

GeoNames

表参考

我认为原始的表名很丑,它们可能与当前项目中的其他表冲突。我换成了不那么丑的名称。您可以通过查看 迁移文件 来了解我们数据库架构使用的名称。