Laravel полиморфное c отношение - возвращает отношение - PullRequest
0 голосов
/ 17 апреля 2020

я хочу разрешить пользователям, у которых есть закладки. это означает, что пользователи могут создавать закладки для постов, статей и т. д. c ... так что это моя схема. id идентификаторов закладок id bookmarkable_id bookmarkable_type user_id идентификаторы статей id идентификаторы записей, как вы можете видеть, что это отношение Polymorphi c.

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

я написал для него отношение, но оно возвращает []; (у пользователя есть хотя бы одно сообщение с закладкой)

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

public function bookmarks()
    {
        return $this->morphMany(Bookmark::class, 'bookmarks', 'bookmarkable_type','user_id');
    }

это результат

Illuminate\Database\Eloquent\Collection {#313 ▼
  #items: []
}

и это модель закладки:

 public function bookmarkable()
    {
        return $this->morphTo();
    }

    public function articles()
    {
        return $this->belongsTo(Article::class ,'bookmarkable_id','id');
    }

и вот как я пытаюсь получить доступ к закладкам:

$articles  = auth()->user()->bookmarks;
dd($articles);

когда я использую это для получения закладок:

public function bookmarks()
    {
        return $this->hasOne(Bookmark::class,  'user_id','id');
    }

он вернет запись в таблице закладок.

1 Ответ

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

Вы не предоставили много информации, поэтому я предполагаю, что схема вашей базы данных выглядит примерно так -

posts
    id - integer
    name - string

articles
    id - integer
    name - string

users
    id - integer
    name - string

bookmarkables
    bookmark_id - integer
    bookmarkable_id - integer
    bookmarkable_type - string

Для ваших моделей Post и Article требуются следующие отношения -

public function bookmarked_by()
{
    return $this->morphToMany(User::class, 'bookmarkable');
}

Ваша модель пользователя тогда нуждается в следующих отношениях -

public function bookmarked_posts()
{
    return $this->morphedByMany(Post::class, 'bookmarkable');
}

public function bookmarked_articles()
{
    return $this->morphedByMany(Article::class, 'bookmarkable');
}

Затем вы можете использовать auth()->user()->bookmarked_posts и auth()->user()->bookmarked_articles.

...