Laravel Eloquent Настройка удаленных отношений - PullRequest
0 голосов
/ 27 января 2019

У меня есть три таблицы, таблица пользователей, таблица документов и таблица избранного.Идея состоит в том, что пользователь может добавить документ в избранное, но я не могу понять, как лучше всего сделать запрос с помощью Eloquent.

User.php

class User extends Authenticatable
{
    public function documents()
    {
        return $this->hasMany('App\Document');
    }

    public function favourites()
    {
        return $this->hasMany('App\Favourite');
    }
}

Document.php

class Document extends Model
{
    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

Favourite.php

class Favourite extends Model
{
    public function user()
    {
        return $this->belongsTo('App\User');
    }

    public function document()
    {
        return $this->belongsTo('App\Document');
    }

}

Любимая таблица представляет собой простую таблицу из 2 столбцов с user_id и document_idсвязывание каждого пользователя с любимой статьей.

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

App\User::with('favourites')->find(1);

Проблема в том, что это возвращает два идентификатора из таблицы избранного, когда я хочу получить данные изтаблица документов, такая как заголовок и идентификатор документа.

Похоже, что для выполнения этого запроса мне может понадобиться отношение "имеет много сквозных", но я не уверен, как его реализовать вэтот вариант использования или даже если отношение «имеет много сквозных» является правильным способом сделать это?

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Вы правы в отношении has-many-through, так что пользователь:

return $this->hasManyThrough('App\Document', 'App\Favourite');

и документ:

return $this->hasManyThrough('App\User', 'App\Favourite');

Eloquent Docs

0 голосов
/ 27 января 2019

Ваша любимая таблица - это сводная таблица.Вам не нужна модель избранного.

User.php

public function favoriteDocuments()
{
    return $this->BelongsToMany('App\Document', 'favorite_documents');
}

Теперь вы можете позвонить $user->favoriteDocuments, чтобы получить документы пользователей.

См. Документы о многих и многих отношениях.https://laravel.com/docs/5.7/eloquent-relationships#many-to-many.

0 голосов
/ 27 января 2019

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

$favoriteDocuments = App\User::with('favourites.document')->find($userId = 1)->get();

// this will contain all the favorite documents for the user, so you can the iterate over them:

foreach($favoriteDocuments as $favoriteDocument)
{
    // $favoriteDocument->document; is the object you are looking for.
}

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

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