#laravel
#laravel
Вопрос:
У меня есть таблица тегов и таблица новостей. Таблица новостей имеет таблицу tag_id в качестве внешнего ключа и сохраняется как разделенное запятыми значение, если у новости более 1 тега. Я хочу получить те теги, в которых есть больше новостей.
Например: В приведенной выше таблице новостей: Идентификатор тега 1 имеет всего 5 новостей, идентификатор тега 2 имеет всего 4 новости, идентификатор тега 3 имеет всего 3 новости, а идентификатор тега 4 имеет всего 2 новости.
Итак, я хочу получить популярные теги от самого высокого количества новостей до самого низкого количества новостей в следующем порядке:
- Политика
- Здравоохранение
- Преступление
- Коронавирус
Как мне это сделать? Пожалуйста, помогите мне!
Комментарии:
1. Ваш дизайн модели db плох. Его проще реализовать, но сложнее работать, как вы заметили. Вы можете либо исправить это, используя отношение N: N, либо выбрать обе таблицы и обработать их в памяти.
2. @DontVoteMeDown Это плохо? У новостей может быть несколько тегов, поэтому я добавил tag_id в качестве внешнего ключа, если это проблема. Я перепробовал почти все, но безуспешно. Я также определил отношения «Многие ко многим» в модели, но я не получаю результата. Пожалуйста, помогите!
3. @MohitPaudel Читайте в документах о многих для многих со сводной таблицей. Эта архитектура — то, что вам здесь нужно.
4. Внезапно мне пришла в голову другая идея, @Tpojka. Я реализовал увеличение количества просмотров новостей в своем проекте, если пользователь нажал на новость, количество просмотров увеличивается. И это будет увеличено, только если он / она не открывал ту же новость раньше. Я реализовал ту же концепцию в тегах. Я добавил столбец с именем views и установил для него значение 0 по умолчанию, и когда какой-либо пользователь нажимает на новости, то, если у новостей есть какой-либо тег, количество просмотров тегов также увеличивается с увеличением просмотров новостей. Итак, я действительно выбираю трендовые теги, верно? Я извлекал трендовые новости таким же образом, выбирая только те новости, просмотры которых актуальны на сегодняшний день.
5. Две разные вещи. Здесь вам нужно отношение «многие ко многим», поскольку статья может иметь много тегов, а также одни и те же несколько тегов могут быть частью разных статей. Вот так просто.
Ответ №1:
Лучший способ реализовать это в laravel — использовать отношение «Многие ко многим». Создайте сводную таблицу news_tag с news_id и tag_id в качестве столбцов. Затем прикрепите теги при создании новостей. Позвольте мне поделиться примером со статьями и тегами.
class Article extends Model
{
public function tags(){
return $this->belongsToMany(Tag::class);
}
}
Затем ваша модель тегов:
class Tag extends Model{
public function articles(){
return $this->belongsToMany(Article::class);
}
}
Тогда ваша сводная таблица будет выглядеть следующим образом:
class CreateArticleTagTable extends Migration
{
public function up()
{
Schema::create('article_tag', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('article_id');
$table->unsignedBigInteger('tag_id');
$table->timestamps();
$table->foreign('article_id')
->references('id')
->on('articles')
->onDelete('cascade');
$table->foreign('tag_id')
->references('id')
->on('tags')
->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('article_tag');
}
}
Затем в вашем контроллере прикрепите теги. вам нужно будет получить идентификатор тега из таблицы тегов и передать его в view, затем в вашей функции store опубликовать идентификатор и прикрепить его к news_tag вот так.
public function store(Request $request)
{
$this->validate($request, [
'heading' => 'required|string|max:191',
'tag_id' => 'required|integer',
]);
if($request->isMethod('post')){
$article = new Article;
$article->heading = $request['heading'];
$article->tag_id = $request['tag_id'];
$article->save();
//attach tags
$article->tags()->attach(request('tag_id'));
}
}
Комментарии:
1. Потому что я подумал, что лучше всего объяснить с помощью скриншотов того, что я делал раньше.. в чем проблема .. неправильный код??
2. я не проверял код, но лучше скопировать код и применить формат кода. Это помогает в SEO, а также позволяет легко копировать и вставлять что-либо в свой собственный код, чтобы опробовать его.