Laravel получает имя столбца с помощью дочерней таблицы с быстрой загрузкой

#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
     );
 

Если у вас возникнут какие-либо проблемы, скажите мне.