通过帖子获取用户标签关系

时间:2021-03-09 17:15:40

标签: php laravel eloquent

我正在构建一个用于学习目的的 Laravel 博客应用程序。
在这个应用程序中,我有与一个用户相关联的帖子,以及与帖子(以及后续视频)相关联的标签。

我拥有的数据库结构:

用户

- id
...

帖子

- id
- user_id
...

标签

- id
...

标签

- id
- tag_id
- taggable_id // post id or video id
- taggable_type // App\Models\Post or App\Models\Video

我拥有的模型:

User.php

public function posts()
{
    return $this->hasMany(Post::class);
}

Post.php

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

public function tags()
{
    return $this->morphToMany(Tag::class, 'taggable')->withTimestamps();
}

Tag.php

public function posts()
{
    return $this->morphedByMany(Post::class, 'taggable')->withTimestamps();
}

问题是我想获取与给定用户的帖子相关联的所有标签。

我认为这可以通过关系来完成,但不知何故我做不到。有没有办法在关系中做到这一点?还是做不到?

我找到的解决方案:
User.php

public function tags()
{
    $posts = $this->posts()
        ->pluck('id');

    return Tag::whereHas('posts', function(Builder $query) use ($posts) {
        $query->whereIn('taggable_id', $posts);
    })->get();
}

此解决方案返回数据集合,而不是关系。在这种情况下,有没有办法恢复关系?还是在这种情况下无法建立关系?

2 个答案:

答案 0 :(得分:0)

我没有测试过,但你可以做类似的事情

public function postTags()
{
    return $this->hasManyThrough(Tag::class, Post::class, 'taggable_id')->where('taggable_type', array_search(static::class, Relation::morphMap()) ?: static::class);
}

这是一个普通的 hasManyThrough,你必须自己构建多态逻辑。

解释您的查询

public function tags()
{
    $posts = $this->posts()
        ->pluck('id');

    // The use of Tag::whereHas returns a Illuminate/Database/Eloquent/Query not an relation like HasMany, HasOne or like in your case a HasManyThrough
    return Tag::whereHas('posts', function(Builder $query) use ($posts) {
        $query->whereIn('taggable_id', $posts);
    })
    ->get(); // The get at the end sends the query to your database, so you receive a collection
}

答案 1 :(得分:0)

我理解你的问题 我有相同类型的数据库关系。 在我存储的 Category_model 表中

  • category_id
  • 模型类型
  • model_id

在类别模型中,我有以下代码:

 public function article()
{
    return $this->morphedByMany(Article::class, 'model', 'category_model', 'category_id');
}

和内部控制器:

  // Show posts by Category
public function ShowArticleByCategory($category)
{
    $cat  = Category::where('name', $category)->firstOrFail();
    $posts = $cat->article()->get()->sortByDesc('id');
    return view('front.pages.show-by-category', compact('posts'));
}

这将为我提供属于选定/提供类别的所有帖子。

希望这能帮助您了解从多态关系中获取数据的想法。

关系内部可以传递的所有参数都定义在里面

vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\HasRelationships.php