2017-07-28 4 views
1

Ich habe eine posts Tabelle, die viele-zu-viele Beziehung mit tags Tabelle hat, verbunden mit Pivot-Tabelle namens tagspivot. Ich zeige einen Beitrag der folgenden Methode:Ähnliche Beiträge basierend auf einem gemeinsamen Tag erhalten?

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

dann lade ich die Post-Tags in der view wie:

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

Meine Frage ist, wie man eine Liste der Beiträge zu erhalten, die die gleichen Tags hat mit dem aktuellen Post? es muss nicht genau dieselben Tags sein, wie der andere Beitrag ein oder zwei allgemeine Tags hat. Wenn möglich, wird die Liste nach dem Beitrag sortiert, der die häufigsten Tags mit dem aktuellen Post hat.

Das ist alles, sorry für mein schlechtes Englisch

Beiträge Tabelle:

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

Schlagwörter Tabelle:

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

Tagspivot Tabelle:

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'); 
     }); 
    } 

Beziehung in Post-Modell :

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

Beziehung in Tag-Modell:

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

So in showtag Route finden möchten Sie einfach alle Beiträge laden, die das gleiche hat Tag, unabhängig von den anderen Tags, die sie haben, bekomme ich das richtig? –

+0

Nein, ich meine, als würde ich eine Liste von Beiträgen abfragen, die häufig verwendete Tags mit dem aktuellen Beitrag teilen, um die meisten verwandten Beiträge zu erhalten. Die 'showtag'-Route zeigt nur eine Liste von Posts, die zu einem Tag gehören. @OmarTarek –

+0

Ich denke, Sie sollten sich die Laravel-Dokumentation anschauen, die contains und whereIn-Methode, ich hoffe, das hilft ein bisschen. https://laravel.com/docs/5.4/collections –

Antwort

0

Wenn Sie alle Post von aktuellen $ titleslug Sie benötigen verwenden wollen whereHas Methode:

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

Dieser Code in funktioniert Fall, wenn Sie Ihre Beziehungen richtig schreiben. Weitere Informationen über whereHas und andere hilfs Beziehungen Methoden diese Uhr:

Querying Relationship Existence

Hoffe, dass es Ihnen helfen, richtige Lösung :)

Verwandte Themen