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();
相反,应该可以解决问题。
希望对您有所帮助。这里公开了一些其他的解决方案:
我有以下两个 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();
相反,应该可以解决问题。
希望对您有所帮助。这里公开了一些其他的解决方案: