Laravel Eloquent 建立国家和城市表之间关系的好方法

Posted

技术标签:

【中文标题】Laravel Eloquent 建立国家和城市表之间关系的好方法【英文标题】:Laravel Eloquent A good way to make relationship between country state and city table 【发布时间】:2021-07-26 16:15:52 【问题描述】:

我有 3 个表,其架构如下所示

countries (rows: 250)
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| id         | bigint(20) unsigned | NO   | PRI |         | auto_increment |
| name       | varchar(255)        | NO   |     |         |                |
| code       | varchar(255)        | NO   | UNI |         |                |country code
| phone_code | varchar(255)        | NO   |     |         |                |
| region     | varchar(255)        | NO   |     |         |                |
| subregion  | varchar(255)        | NO   |     |         |                |
| created_at | timestamp           | YES  |     |         |                |
| updated_at | timestamp           | YES  |     |         |                |
| deleted_at | timestamp           | YES  |     |         |                |
+------------+---------------------+------+-----+---------+----------------+
states (rows: 4866)
+-------------+---------------------+------+-----+---------+----------------+
| Field       | Type                | Null | Key | Default | Extra          |
+-------------+---------------------+------+-----+---------+----------------+
| id          | bigint(20) unsigned | NO   | PRI |         | auto_increment |
| name        | varchar(255)        | NO   |     |         |                |
| country_code| varchar(255)        | NO   | MUL |         |                | this is country code
| state_code  | varchar(255)        | YES  |     |         |                |
| lat         | varchar(255)        | YES  |     |         |                |
| lon         | varchar(255)        | YES  |     |         |                |
| created_at  | timestamp           | YES  |     |         |                |
| updated_at  | timestamp           | YES  |     |         |                |
| deleted_at  | timestamp           | YES  |     |         |                |
+-------------+---------------------+------+-----+---------+----------------+    
cities (rows: 146068)
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| id         | bigint(20) unsigned | NO   | PRI |         | auto_increment |
| name       | varchar(255)        | NO   |     |         |                |
| lat        | varchar(255)        | YES  |     |         |                |
| lng        | varchar(255)        | YES  |     |         |                |
| population | varchar(255)        | YES  |     |         |                |
| state_code | varchar(255)        | NO   |     |         |                |state code not unique
| created_at | timestamp           | YES  |     |         |                |
| updated_at | timestamp           | YES  |     |         |                |
| deleted_at | timestamp           | YES  |     |         |                |
+------------+---------------------+------+-----+---------+----------------+

我正在使用 quickadminpanel 来生成这些 CRUD,但主要问题是我从 csv 文件中导入了这些 git link for csv 和 csvimport 特征,如 https://pastebin.com/G9z8Rjf1

有什么方法可以在这三个表之间建立关系 country:code and state:country_code 关系和state:state_code and city:state_code 关系,因为我无法手动添加州(行:4866)和城市(行:146068)

那么我怎样才能使用模型或任何更好的方式或任何更好的特质来建立关系呢?

【问题讨论】:

为什么不使用主键作为另一个表的引用键? 您可以使用国家表的主键是其他表的外键,如果您还想检索每条记录的国家代码,那么您可以简单地使用with ()函数跨度> 这就是我想做的,但要做到这一点,codecountry_code 列应该匹配并使用模型或使用 db 建立关系,这并不重要 我如何将它与不同的表匹配我有很好的例子***.com/a/57358462/15121609 但在这里他有搜索查询,但我在两个表中都有一个列可以得到那个? 您可以简单地将主键从 id 更改为 code 【参考方案1】:

只需将每张表的主键分别改为code,state_code,city_code即可

注意:更改多个以使 states 表中的 state_code 和 city_code 中的 city_code 唯一

在你的模型中改变关系

/* return $this->hasMany(Model::class, 'foreign_key', 'local_key');*

return $this->hasMany(State::class, 'country_code', 'code');

/// return $this->belongsTo(Model::class, 'foreign_key', 'owner_key');///

return $this->belongsTo(Country::class, 'code', 'country_code');

那么你就可以正常访问所有数据了..

【讨论】:

我遇到了一个问题,我无法在两个表中创建state_code 列的主键,因为它不是唯一的?它只是说请选择主键或唯一键 你在状态表中存储状态名称是吗?州代码在州表中是唯一的......(它将是城市表中的外键,因为一个州有很多城市......)。一个州没有很多州代码..就像一把钥匙..它将是唯一的。 将state_code和city_code分别在state表和city表中修改为唯一 州代码不是唯一的,因为不同的国家使用相同的州代码,所以它重复了:( 在该表中,马哈拉施特拉邦(在印度)的州代码 MH 也是爱尔兰米斯郡的代码,还有更多类似这个州代码的示例

以上是关于Laravel Eloquent 建立国家和城市表之间关系的好方法的主要内容,如果未能解决你的问题,请参考以下文章

试图用三个表(用户、个人资料、国家)修复我的 Laravel 7 Eloquent 关系

Laravel Eloquent - 使用连接选择列文本类似于其他表中的列文本

从 eloquent builder laravel 7 获取关系数据

Laravel Eloquent 关系 - 3 个表,其中一个是查找表

Laravel Eloquent ORM "whereHas" 通过表

Laravel五大功能之Eloquent关系模式