根据常用标记获取相关帖子?

时间:2017-07-28 03:41:52

标签: laravel laravel-5 eloquent

我有一个与posts表有多对多关系的tags表,使用名为tagspivot的数据透视表连接。我使用以下方法显示帖子:

public function showpost($titleslug) {
    $post = Post::where('titleslug','=',$titleslug)->first();
    return view('posts/show', compact('post', $post));
}

然后我在view中加载帖子标签,如:

@foreach($post->tags as $ptags)
  <li><a href="{{route('showtag', $ptags->titleslug)}}" class="button smallGrey">#{{$ptags->title}}</a></li>
@endforeach

我的问题是,如何获取与当前展示帖子具有相同标签的帖子列表?它不必是完全相同的标签,就像其他帖子有一个或两个常见标签一样。如果可能,列表将按照当前显示帖子的最常见标记的帖子进行排序。

这就是全部,抱歉我的英语不好

帖子表:

public function up() {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('content');
            $table->string('titleslug');
            $table->timestamps();
        });
    }

标签表:

public function up() {
        Schema::create('tags', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->string('titleslug');
            $table->timestamps();
        });
    }

Tagspivot表:

public function up() {
        Schema::create('tagspivot', function (Blueprint $table) {
            // Create tabel tagspivot
            $table->increments('id');
            $table->integer('post_id')->nullable()->unsigned()->index();
            $table->integer('tag_id')->nullable()->unsigned()->index();
            $table->timestamps();

            // Set FK tagspivot --- posts
            $table->foreign('post_id')
                    ->references('id')
                    ->on('posts')
                    ->onDelete('cascade')
                    ->onUpdate('cascade');

            // Set FK tagspivot --- tags
            $table->foreign('tag_id')
                    ->references('id')
                    ->on('tags')
                    ->onDelete('cascade')
                    ->onUpdate('cascade');
        });
    }

Post模型中的关系:

public function tags()
    {
        return $this->belongsToMany('App\Tag', 'tagspivot', 'post_id', 'tag_id')->withTimeStamps();
    }

标签模型中的关系:

public function posts() {
        return $this->belongsToMany('App\Post', 'tagspivot', 'tag_id', 'post_id');
    }

1 个答案:

答案 0 :(得分:0)

如果你想通过当前的$ titleslug获得所有帖子,你需要使用 whereHas 方法:

Post::whereHas('tags', function ($query) use ($titleslug) {
        $query->where('slug', $titleslug);
    })->get();

如果您正确地编写关系,此代码将起作用。有关whereHas和其他有用的关系方法的更多信息,请观察:

Querying Relationship Existence

希望它能帮助您找到正确的解决方案:)