Laravel Eloquent Тройная связь с Pivot - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь установить связь между 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
...