Laravel hasManyThrough манипулирует user_id
У меня проблемы с функцией hasManyThrough в Laravel.
Моя цель - получить фид, в котором будут отображаться сообщения, за которыми следит зарегистрированный пользователь. Я пытаюсь достичь этого путем:
- В User.php получите идентификатор вошедшего в систему пользователя
- Сопоставьте идентификатор пользователя со столбцами с именем user_id в Follow.php
- Получить target_id из строк в Follow.php
- Получить сообщения, где user_id соответствует target_ids из Follow.php
Я правильно извлекаю данные, кем следует пользователь. Однако user_id, который возвращается в данных, является зарегистрированным пользователем, а не автором сообщения. Зачем?
User.php
public function feed() {
return $this->hasManyThrough(
'App\Post',
'App\Follow',
'user_id',
'user_id',
'id',
'target_id'
)
->with('user')
->orderBy('id', 'DESC');
}
Post.php
public function user() {
return $this->belongsTo('App\User');
}
Вызывается из контроллера через
$posts = Auth::user()->feed;
1 ответ
Решение
Ваш код создает этот запрос: select `posts`.*, `follows`.`user_id`...
Как вы видете, posts.user_id
перезаписывается follows.user_id
(follows.user_id
необходимо для энергичной загрузки).
Я вижу два возможных решения вашей проблемы:
- переименовывать
follows.user_id
, - Используйте два отдельных отношения:
User
→HasMany
→Follow
→HasMany
→Post