Я пытаюсь установить связь между 3 таблицами с помощью pivot.Я просто хочу сделать это с помощью eloquent из-за метода count()
.
Вот мои таблицы.
brands: id, name
posts: id, title
tags: id, name, brand_id (fk)
post_tag: post_id (fk), tag_id (fk)
Объяснение:
- Бренд hasMany сообщенийчерез тег,
- теги принадлежат бренду
- бренд должен выбрать post_id из сводной таблицы через теги, чтобы получить правильные сообщения.
И в PostsController
я получаютеги тренда (как Бренд, если имя тега равно названию бренда), чтобы сделать такой заказ
protected function getTrends($model)
{
return $model::has('posts', '>=', '1')->withCount(['posts' => function($q) {
$q->whereDate('created_at', '>', \Carbon\Carbon::now()->subWeek());
}])->orderBy('posts_count', 'DESC')->take(10)->get();
}
Вот что я хочу сделать:
- Во-первых, я получаю тегимя и поиск в таблице брендов, чтобы получить его при создании сообщения.После этого я получаю сообщения, которые присваиваются тегам из сводной таблицы для создания списка на странице сообщений / индекса.И тег принадлежит бренду;на данный момент я хочу получить бренд и показать его свойства.Также мне нужно иметь возможность получить количество постов по модели как
$brand->posts()->count()
, чтобы заставить работать функцию getTrends.
Я пробовал hasManyThrough на модели бренда, но он не выбирает идентификатор из сводки post_tag,Так что это показывает мне неправильный результат.
Я не уверен, что мне делать.Может быть, я делаю простую ошибку, но я не вижу ее из-за попытки столько часов.
РЕДАКТИРОВАТЬ
Использование функции getTrends.
\\PostsController;
public function index()
{
$posts = Post::orderBy('created_at', 'desc')->paginate(10, ['*'], 'sayfa');
//Get Popular brands of the week by created posts count
$popularBrands = $this->getTrends('App\Brand');
//Get Popular products of the week by created posts count
$popularProducts = $this->getTrends('App\Product');
$popularPosts = Post::popularWeek()->take(10)->get();
$data = ['posts', 'popularBrands', 'popularProducts', 'popularPosts'];
return view('posts.index', compact($data));
}
Это означает, что товары или бренды могут быть трендом в качестве тега.
Лезвие представления posts.index
@foreach($popularBrands as $popularBrand)
@if($popularBrand->posts_count > 0)
<div class="col-12 {{ $loop->last ? 'mb-0' : 'mb-2' }}">
<a href="{{ route('brand.posts', $popularBrand->slug) }}" class="row nodecoration align-items-center" data-toggle="tooltip" data-placement="left" data-title="{{ $popularBrand->name }}">
<span class="col-auto col-lg p-0 text-truncate" ># {{ $popularBrand->name }}</span>
<span class="col col-lg-auto text-right p-0 font-14 text-muted">{{ $popularBrand->posts_count }} konu</span>
</a>
</div>
@endif
@endforeach