Laravel 与主键不同的列的一对多关系

Laravel one-to-many relationship with different column than primary key

我有以下两个 table:

account:

+--------------------------+---------------------+------+-----+---------+-------+
| Field                    | Type                | Null | Key | Default | Extra |
+--------------------------+---------------------+------+-----+---------+-------+
| id                       | varchar(25)         | NO   | PRI |         |       |
| name                     | varchar(191)        | NO   | UNI | NULL    |       |
| status                   | tinyint(3) unsigned | NO   |     | NULL    |       |
| active                   | tinyint(3) unsigned | NO   |     | NULL    |       |

project:
+-----------------------+------------------+------+-----+---------+----------------+
| Field                 | Type             | Null | Key | Default | Extra          |
+-----------------------+------------------+------+-----+---------+----------------+
| id                    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| client_code           | varchar(191)     | NO   |     | NULL    |                |
| tags                  | varchar(500)     | YES  |     | NULL    |                |
| project_id            | int(11)          | NO   |     | NULL    |                |
| file_name             | varchar(191)     | NO   |     | NULL    |                |
| total_records         | int(11)          | NO   |     | NULL    |                |

账号和项目是一对多的关系。

projects table 中的外键被命名为 account_code 而不是 account_id

项目标识符列的问题是 project_id 而不是项目 table 中的 id

这是我的帐户模型:

public function projects() {
    return $this->hasMany('App\Project', 'account_code');
}

项目模型:

public function account() {
    return $this->belongsTo('App\Account', 'account_code', 'project_id');
}

我在项目中有一行 table 作为:

 id: 9
 account_code: 0011T00002K95MLQAZ
 tags: cpi|test|dmf
 project_id: 312
 file_name: conf_matrix_dev_1579064650.tsv
 total_records: 19

我尝试检索 account 属于 project_id 312 的详细信息。

$project = \App\Project::where('project_id', 312)->get();
dd($project->account->name);

这会引发异常:

Property [account] does not exist on this collection instance

还有这个:

$project = \App\Project::find(312);

这试图通过 id 字段而不是 project_id 来查看。

如何在不编写查询的情况下解决这个问题?

这里的问题是 get 正在检索一个集合而不是一个实例。您可以使用

$project = \App\Project::where('project_id', 312)->first();

相反,应该可以解决问题。

希望对您有所帮助。这里公开了一些其他的解决方案: