Получить Taggables по общим тегам, используя rtconner / laravel-tagging

Я совсем новичок в 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');
});

Это немного над моей головой. Какие-либо ведет?

1

Решение

Вы также можете сделать это с помощью 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();
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]