#laravel #eloquent
Вопрос:
Я хочу извлечь данные из таблицы профилей, используя дочернюю таблицу другой родительской таблицы.
Вот таблицы
Таблица профилей
id
profile_name
Таблица транзакций
id
transaction_name
Таблица вложенных транзакций
id
transaction_id
profile_id
Теперь я хочу получить имя профиля из модели транзакций с помощью быстрой загрузки . я попробовал, хотя у меня есть одно отношение в модели транзакций, но оно возвращает значение null
Вот мои отношения в модели транзакций
public function profileName()
{
return $this->hasOneThrough(
Profiler::class,
SubTransaction::class,
'profile_id',
'id',
'id',
'transaction_id',
);
}
Вот где я пытаюсь извлечь данные из контроллера транзакций
$options = Transaction::with([
'profileName:id,profile_name as profileName',
])
->get();
Комментарии:
1. Вы должны использовать отношение «многие ко многим»… если у вас есть таблица, в которой есть
model1_id
model2_id
столбцы и, и это отношение, то вы должны использоватьbelongsToMany
неhasOneThrough
. Можете ли вы объяснить, почемуprofile_id
находится вsub transaction
таблице, а не вtransaction
таблице ? В чем идея иметьsub transaction
стол ?2. Идея использования дополнительной транзакции заключается в том, что у некоторых транзакций нет идентификатора профиля . поэтому я создал таблицу для хранения идентификатора профиля этих транзакций. У каждой транзакции есть только один идентификатор профиля, так что, как вы думаете, их будет много ко многим ?
Ответ №1:
Он возвращает значение null, потому что я думаю, что у вас есть небольшая проблема с сопоставлением внешних ключей и локальных ключей. Вы можете попробовать следующий код:
return $this->hasOneThrough(
Profiler::class, //Final model we wish to access
SubTransaction::class, //The name of the intermediate model
'transaction_id', //Foreign key on sub_transaction table
'id', //Foreign key on profile table
'id', //Local key on transaction table
'profile_id', //Local key on sub_transaction table
);
Если у вас возникнут какие-либо проблемы, скажите мне.