Laravel 5.6 - энергичная загрузка в зависимости от значения в родительской таблице - PullRequest
0 голосов
/ 26 августа 2018

Post.php

$fillable = ['id','flag'];

public function tags() 
{
  return $this->belongsToMany('App\Tags')->withPivot('pivot_flag');
}

public function flaggedTags()
{
  return $this->tags()->where('pivot_flag', 1)->get();
}

Tag.php

$fillable = ['id']
public function posts() 
{
  return $this->belongsToMany('App\Post');
}

Сводная таблица post_tag столбцы: post_id, tag_id, pivot_flag

Мне нужно получить сообщение с тегами:

$post = Post::select('id','flag')->with('tags')->find($postId);

Однако, если для flag в сообщении установлено значение 1, то мне нужны только теги, которые имеют значение pivot_flag в сводной таблице post_tagустановите 1

Так что в этом случае у меня будет следующее:

$post = Post::select('id','flag')->with('flaggedTags')->find($postId);

Как я могу сделать это в одном запросе?Я всегда мог сделать один запрос, чтобы проверить, помечен ли Post или нет, а затем выполнить соответствующий запрос для Tags, но это кажется расточительным.

Приветствуются красноречивые или необработанные запросы MySQL.

Спасибо!

ОБНОВЛЕНИЕ - Альтернативное решение

Загрузить все теги и затем отфильтровать результат в зависимости от значения flag сообщения:

if($post->flag)
{
  $tags = $post->tags->filter(funtction($q) {
     return $q->pivot->pivot_flag == 1;
  });
}
else 
{
  $tags = $post->tags;
}

Этоможет быть быстрее в зависимости от количества tags.Не совсем уверен, нужно проверить это все же.Любые отзывы об этом в комментариях приветствуются.

...