Попытка получить набор записей, содержащий все файлы людей, на которых вы подписаны - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь создать небольшую функцию для создаваемого веб-сайта, которая позволит вам следить за другими пользователями, а затем ваша панель будет заполнена файлами, которые они загружают в указанном порядке.(Вы можете сравнить его с YouTube. Вы подписываетесь на канал, и на странице подписки вы видите каждое видео по порядку по дате подписчиков.)

Это структура моей модели (она упрощена только для показанеобходимые значения, чтобы это работало).

Follow

  • my_id (Это ваш идентификатор)
  • user_id (Это идентификатор пользователя, которого вы 'повторяю)

Пользователь

  • id (идентификатор пользователя)

Файлы

  • user_id (Theидентификатор пользователя, который загрузил файл)
  • путь (путь к файлу)

Сейчас я много чего пробовал, чтобы получить данные:

Follow::where('me_id', '=', Auth::user()->id)->get()->all()->files;  
Follow::where('me_id', '=', Auth::user()->id)->get()->files;  

единственное, что, кажется, работает (но это только для 1 подписки):

Follow::where('me_id', '=', Auth::user()->id)->first()->files;  

Было бы удивительно, если бы кто-то мог видеть, что я делаю неправильно.
В моей Follow.php моделиУ меня он подключен вот так.

class Follow extends Model
{
    protected $fillable = ['user_id', 'me_id'];

    public function me()
    {
        return $this->belongsTo(User::class, 'id', 'me_id');
    }

    public function user()
    {
        return $this->belongsTo(User::class, 'id', 'user_id');
    }

    public function files()
    {
        return $this->hasManyThrough(
            'App\File', //The model I'm trying to reach
            'App\User', //The model I need to go through to reach the files
            'id', //This is where I'm going wrong I think
            'user_id', //Same here
            'user_id', //Same here
            'id' //Same here
        );
    }
}

РЕДАКТИРОВАТЬ:
У меня работает, делая 2 отдельных вызова базы данных.Но возможно ли это за один звонок?См. Код внизу.

public function following(Request $request)
    {
        $follows = Follow::where('me_id', '=', Auth::user()->id)->get()->all();
        $userIds = [];

        foreach($follows as $key => $follow) {
            $userIds[] = $follow->user_id;
        }
        $files = File::where('visible', '=', '1')->whereIn('user_id', $userIds)->orderBy('created_at', 'desc')->paginate(12)->onEachSide(3);
    }

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Ваше определение модели в порядке, так как вы можете получить файлы, используя:

Follow::where('me_id', '=', Auth::user()->id)->first()->files;  

Ваша ошибка

Следующий код возвращает коллекцию laravel :

Follow::where('me_id', '=', Auth::user()->id)->get()

Следующий код возвращает массив:

Follow::where('me_id', '=', Auth::user()->id)->get()->all()

И files - это динамическое свойство модели Follow (не коллекция и не массив).Так что это не сработает, как вы ожидаете.

Ваше правильное решение

Вы должны использовать eloquent Relations Feature:

Follow::with('files')->where('me_id', '=', Auth::user()->id)->get()

Это возвращаетколлекция Follow, содержащая все их соответствующие files.как:

[
    'my_id' -> 1,
    'user_id' -> 1,
    'files' -> [
        'user_id' -> 1,
        'path' -> '/foo/bar'
    ]
]
0 голосов
/ 22 декабря 2018

Я думаю, вы могли бы сделать это в два этапа.

  1. Получить пользователя, за которым следует пользователь
  2. Получить файлы от пользователей с идентификаторами из первого запроса
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...