我正在构建一个用于学习目的的 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();
}
此解决方案返回数据集合,而不是关系。在这种情况下,有没有办法恢复关系?还是在这种情况下无法建立关系?
答案 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 表中
在类别模型中,我有以下代码:
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