Laravel многоуровневые отношения - PullRequest
0 голосов
/ 26 апреля 2020

Я застрял на проблеме отношений Это моя база данных:

users table:
id
participants table:
user_id
conversation_id
conversations table:
name

В моем классе пользователя

    public function participants() {
        return $this->hasMany(Participant::class);
    }

    public function conversations() {
        return $this->hasManyThrough(Conversation::class, Participant::class);
    }

Но у меня возникает ошибка, когда Я пытаюсь получить доступ к разговорам.

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'conversations.participant_id' in 'on clause' (SQL: select `conversations`.*, `participants`.`user_id` as `laravel_through_key` from `conversations` inner join `participants` on `participants`.`id` = `conversations`.`participant_id` where `participants`.`user_id` = 1) 

Я пробовал это

    public function conversations() {
        return $this->hasMany(Participant::class)->with('conversation');
    }

Но результат не очень хороший, и я не уверен, что это хороший способ сделать это!

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Это не структура отношений hasManyThrough, а также отношение hasMany

Это отношение ownToMany, но вместо того, чтобы у вас была таблица speech_user, вы назвали ее участниками, попробуйте это:

public function conversations()
{
    return $this->belongsToMany(Conversation::class, 'participants');
}

Второй параметр 'participants' предназначен для переопределения ожидаемого имени таблицы, которое будет 'conversation_user'. Я рекомендую прочитать больше об этом на документах. https://laravel.com/docs/7.x/eloquent-relationships#many-ко-многим

Кстати, вам не хватает идентификатора в таблице разговоров, но, я полагаю, он у вас есть, потому что у вас есть разговор_идента для участников.

0 голосов
/ 26 апреля 2020

В соответствии с официальной Laravel документацией ;

Типичные соглашения о внешних ключах Eloquent будут использоваться при выполнении запросов отношения. Если вы хотите настроить ключи отношения, вы можете передать их в качестве третьего и четвертого аргументов методу hasManyThrough. Третий аргумент - это имя внешнего ключа промежуточной модели. Четвертый аргумент - это имя внешнего ключа в окончательной модели. Пятый аргумент - это локальный ключ, а шестой аргумент - это локальный ключ промежуточной модели:

Вам необходимо настроить метод conversations в соответствии с внешними ключами.

...