Вы описали наиболее разумный способ создания ссылок, хотя ваш код можно немного оптимизировать, удалив некоторые ненужные назначения:
$links['contacts'] = $this->contacts->map(function ($contact) {
return route('contacts.show', [ 'contact' => $contact->id ]);
});
if ($this->note !== null) {
$links['note'] = route('notes.show', [ 'note' => $this->note->id ]);
}
$links['self'] = route('companies.show', [ 'company' => $this->id ]);
Если, однако, id
- это все, что вам нужно для вашегоcontacts
и note
, вы можете загрузить эту информацию только из вашей базы данных.Будьте внимательны и при загрузке внешних ключей, необходимых для сопоставления этих внешних объектов с их родителями:
$company = Company::query()
->with([
'contacts' => function ($query) {
$query->select(['id', 'company_id']);
},
'note' => function ($query) {
$query->select(['id', 'company_id']);
},
])
->find($companyId);
Абсолютно грязный способ, и я даже не уверен, что он гораздо более эффективен,создать шаблон маршрута и заменить часть id
непосредственно в SQL.Но я не рекомендую его и пишу только для демонстрации:
$companyRoute = route('companies.show', ['company' => 999999]);
$contactRoute = route('contacts.show', ['contact' => 999999]);
$noteRoute = route('notes.show', ['note' => 999999]);
$company = Company::query()
->with([
'contacts' => function ($query) {
$query->select(['id', 'company_id', \DB::raw("REPLACE(?, '999999', id) as link")])
->addBinding($contactRoute, 'select');
},
'note' => function ($query) {
$query->select(['id', 'company_id', \DB::raw("REPLACE(?, '999999', id) as link")])
->addBinding($noteRoute, 'select');
},
])
->select([
'*',
\DB::raw("REPLACE(?, '999999', id) as link"),
])
->addBinding($companyRoute, 'select')
->find($companyId);
Последний фрагмент не проверен и НЕ предназначен для использования.