Я совсем новичок в Laravel. Я установил плагин RConner для Laravel-Tagging. Работает нормально.
На странице поста я хотел бы получить другие посты (теги) с похожими тегами.
Я знаю, что могу сделать это, используя соединения SQL и рассчитывать (но не совсем как)
Я пытался добавить область видимости в TaggableTrait, но я борюсь с объединениями.
Я хотел бы знать, есть ли «Путь Ларавела» для создания магии.
Спасибо !
Редактировать :
На самом деле, я пытаюсь получить «теги», упорядоченные по количеству общих тегов с текущим содержимым.
Я пытаюсь добавить метод области видимости в TaggableTrait, например:
public function scopeWithCommonTag($query, $tagNames)
{
$tagNames = TaggingUtil::makeTagArray($tagNames);
$normalizer = \Config::get('tagging::normalizer');
$normalizer = empty($normalizer) ? '\Conner\Tagging\TaggingUtil::slug' : $normalizer;
$tagNames = array_map($normalizer, $tagNames);
$query = $query->whereHas('tagged', function ($q) use ($tagNames) {
$q->whereIn('tag_slug', $tagNames)->groupBy('taggable_id')->orderByRaw('count(*)');
});
}
Результирующий запрос:
select * from `contents` where (
select count(*) from `tagging_tagged`
where `tagging_tagged`.`taggable_id` = `contents`.`id`
and `tagging_tagged`.`taggable_type` = ?
and `tag_slug` in (?, ?)
group by `taggable_id`
order by count(*)
) >= 1
Что мне нужно это:
select * from `contents` where taggable_id in (
select taggable_id,count(*) as common_tags
from `tagging_tagged`
where `tagging_tagged`.`taggable_id` = `contents`.`id`
and `tagging_tagged`.`taggable_type` = ?
and `tag_slug` in (?, ?)
group by `taggable_id`
order by common_tags desc
) limit 3;
Может быть, что-то вроде этого (я пытался использовать whereIn (‘id’, closure), но, очевидно, он не присоединяется к таблице с тегами …
$query = $query->whereHas('tagged', function ($q) use ($tagNames) {
$q->select(array('taggable_id',\DB::raw('count(*) as common_tags')))->whereIn('tag_slug', $tagNames)->groupBy('taggable_id')->orderByRaw('common_tags desc');
});
Это немного над моей головой. Какие-либо ведет?
Вы также можете сделать это с помощью Eloquent, если ваши отношения верны.
Я не знаю, какая у вас схема, поэтому это решение в обобщенном виде.
1 — Получить идентификаторы всех тегов сообщения.
2- Затем вы можете запросить ваше отношение, используя красноречивый метод whereHas. Что-то вроде этого
$postTags = [1,2,3,4,5]; // List of tags id of a particular post
$similarPosts = Post::whereHas('tags', function($q) use ($postTags) {
$q->whereIn('id', $postTags);
})->get();
Прочитай это Опрос отношений
Обновить:
Я только что посмотрел на пакет, в котором есть предопределенный метод для получения похожих статей, который также делает то же самое, что упомянуто выше.
Прочитайте документы пакета
Article::withAnyTag(array('Gardening','Cooking'))->get();
Других решений пока нет …