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
.Не совсем уверен, нужно проверить это все же.Любые отзывы об этом в комментариях приветствуются.