首页 > 解决方案 > 如果数据透视表条件为真,Laravel 从集合中获取第一项

问题描述

假设我的数据库中有以下多对多多态关系。

posts
    id - integer
    name - string

videos
    id - integer
    name - string

tags
    id - integer
    name - string

taggables
    tag_id - integer
    taggable_id - integer
    taggable_type - string
    stuff - string

我从数据库中检索帖子。

$post = Post::find(1);

我怎样才能在哪里获得与这篇文章相关的标签stuff == something?我想创建函数,以便每次需要时都可以调用它。

此代码有效:

public function get_my_tag() {
    return $post->tags()->wherePivot('stuff', 'something')->first();
}

但是每次我调用它时它都会从数据库中检索它。我需要一种将 $tag 存储在 $post 中的方法,因此无论我调用多少次get_my_tag(),它都应该只从数据库中检索一次。

标签: phplaravelmany-to-manypivot-table

解决方案


像这样做

Post::with([
    'tags' => function ($query) {
        $query->where('any_field_on_tags_table', 'value');
    },
])->find(1);

你需要使用whereHas()方法

Post::with('tags')->whereHas('tags', function ($query) {
    $query->where('any_field_on_tags_table', 'value');
})->find(1);


推荐阅读