Laravel отношение один ко многим с другим столбцом, чем первичный ключ - PullRequest
0 голосов
/ 15 января 2020

У меня есть две таблицы:

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 взамен называется account_code из account_id.

Проблема в том, что столбец идентификатора проекта имеет значение project_id, а не id в таблице проектов.

Вот моя модель учетной записи:

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

Модель проекта:

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

У меня есть строка в таблице проектов как:

 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.

Как я могу решить эту проблему без необходимости писать запрос?

1 Ответ

1 голос
/ 15 января 2020

Проблема здесь в том, что get возвращает вам коллекцию, а не экземпляр. Вместо этого вы можете использовать

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

, и это должно сработать.

Надеюсь, это поможет. Здесь представлены некоторые другие решения: Свойство [title] не существует в этом экземпляре коллекции

...