Laravel получить первый элемент из коллекции, если условие сводной таблицы истинно - PullRequest
0 голосов
/ 06 апреля 2020

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

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(), он должен извлекать его из базы данных только один раз.

1 Ответ

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

Сделайте это так

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);

...